我尝试使用Compiler API处理JavaScript代码并使用Type inference来预测'object.property'PropertyAccessExpression节点中的'object'类型。像第一个样本打击的简单工作正常,但大多数示例失败,想知道这是否是使用TypeScript类型推断的有意方式,或者因为我没有编写正确的代码?谢谢!
var obj={prop: ''};
var h=obj;
h.prop = ''; //works! 'h' show as 'obj' type
function fx(arg) {return arg;}
var i=fx(obj);
i.prop = ''; //failed! type of 'i' show 'any', it should be 'obj'
下面是使用checker打印推断类型的源代码:
var ts = require('typescript');
function visit(node) {
ts.forEachChild(node, visit);
console.log( checker.getSymbolAtLocation(node.name));
}
var program = ts.createProgram([process.argv[2]], {lib: ['DOM'], allowJs: true, target: ts.ScriptTarget.ES5, module: ts.ModuleKind.None});
var checker = program.getTypeChecker();
ts.forEachChild(program.getSourceFiles()[0], visit);
因为你的函数返回any
所以i
也是any
类型。 i
也不能只是obj
类型的{prop: string}
。
您可以使您的功能成为通用功能:
function fx<T>(arg: T): T {return arg;}
var i=fx(obj);
在这种情况下,i
属于{prop: string}
类型。