【问题标题】:Type Inference support for Javascript对 Javascript 的类型推断支持
【发布时间】:2017-11-09 15:28:01
【问题描述】:

我尝试使用 Compiler API 来处理 JavaScript 代码并使用类型推断来预测“object.property”PropertyAccessExpression 节点中的“对象”类型。 像第一个示例这样的简单示例效果很好,但是大多数示例都失败了,想知道这是故意使用 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'

以下是使用检查器打印推断类型的源代码:

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);

【问题讨论】:

    标签: javascript typescript type-inference


    【解决方案1】:

    由于您的函数返回 any,所以 i 也是 any 类型。此外,i 永远不能是 obj 类型,只能是 {prop: string} 类型。

    你可以让你的函数成为一个泛型函数:

    function fx<T>(arg: T): T {return arg;}
    var i=fx(obj);
    

    在这种情况下,i 的类型为 {prop: string}

    【讨论】:

    • 不,'i' 应该是 'obj'... ...仅当推理引擎分析代码中的 'fx()' 返回语句和 'fx(obj)' 调用时。顺便说一句,我正在处理任意合法的 JavaScript 代码,所以我可以更改我的代码以适应输入源,而不是相反。
    • 您是否尝试过使您的函数通用化?你买的是什么类型的?
    • 对不起,我无法按照您的建议更改为通用函数:1)我采用有效的 JavaScript 输入来推断类型,您响应中的通用函数代码甚至不是有效的 Javascript 语法。 2) 我无法控制我得到的输入,除了它是有效的 Javascript 代码。
    • 你知道 TypeScript 编译器在推断 Javascript 类型方面的深度吗?例如,它是否分析函数返回和函数调用以预测所有可能的类型,并处理所有使用定义的表达式?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多