我尝试使用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);
答案 0 :(得分:0)
由于您的函数返回any
,因此i
的类型为any
。此外,i
永远不能是类型为obj
的{{1}}类型。
您可以将您的功能设为通用功能:
{prop: string}
在这种情况下,function fx<T>(arg: T): T {return arg;}
var i=fx(obj);
属于i
类型。