2017-11-09 10 views
0

コンパイラAPIを使用してJavaScriptコードを処理し、タイプ推論を使用して 'object.property' PropertyAccessExpressionノードの 'オブジェクト'のタイプを予測しようとしています。 最初のサンプルブローのようなシンプルなものがうまくいきましたが、ほとんどの例が失敗しました。これが意図的なタイプの推論を使用しているのか、適切なコードを書いていないのか不思議です。ありがとうございました!以下はタイプ推論JavaScriptのサポート

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

答えて

0

あなたの関数がanyを返すようにiがあまりにも、タイプanyです。また、iobjのタイプで、タイプが{prop: string}でないことはありません。 iはタイプ{prop: string}である。この場合、

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

あなたは、あなたの関数の一般的な機能を行うことができます。

+0

いいえ、 'i'は 'obj'にする必要があります... ...推論エンジンが 'fx()' return文と 'fx(obj)'呼び出しをコードから解析する場合のみです。ところで、私は任意の正当なJavaScriptコードを処理しているので、入力ソースに適応するようにコードを変更することができます。 –

+0

あなたの機能を一般的にしようとしましたか?どのようなタイプを手に入れましたか? – zgue

+0

申し訳ありませんが、私はジェネリック関数にあなたが示唆したように変更することはできません:1)私はタイプを推論するために有効なJavaScript入力を取る、あなたの応答のジェネリック関数コードも有効なJavaScriptの構文ではありません。 2)有効なJavascriptコードを除いて、私はどのような入力が得られるかを制御できません。 –

関連する問題