import references = require('references'); import _ = require('lodash'); import Types = require('tsd-schema'); export = isAssignableTo; function isAssignableTo(value: any, type: any) { var schema = this; //TODO: handle a few special cases... if (typeof type === 'string') { switch (type) { case 'any': return true; case 'string': return value === null || typeof value === 'string'; case 'number': return value === null || typeof value === 'number'; default: return schema[type] && schema.isAssignableTo(value, schema[type]); } } //TODO: assume type is an interface for now.... Generalise this. var optional = type['@optional'] || {}; for (var propName in type) { if (!type.hasOwnProperty(propName)) continue; //TODO: ignore @blah props for now - but come back to these... if (propName.indexOf('@') === 0) continue; // Ignore optional members. if (optional[propName]) continue; // Get required member value. if (!(propName in value)) return false; // Recursively ensure assignability of member value. if (!schema.isAssignableTo(value[propName], type[propName])) return false; } // If we get to here, consider the value to be assignable to the type. return true; }