2017-11-09 4 views
0

JavaScript 코드를 처리하기 위해 컴파일러 API를 사용하고 Type 추론을 사용하여 'object.property'PropertyAccessExpression 노드에서 'object'유형을 예측하려고합니다. 첫 번째 샘플 송풍과 같은 간단한 것들이 잘 작동했지만 대부분의 예제가 실패했습니다. 이것이 TypeScript 형식 추론을 사용하는 의도적 인 방법인지 또는 적절한 코드를 작성하지 않았기 때문에 궁금한 점이 있습니까? 고맙습니다! 함수가 any 그래서 i 유형 any이다 리턴으로도자바에 대한 추론 지원

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

:

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' 

다음은 추론 유형을 인쇄 검사기를 사용하여 소스 코드입니다. 또한 i은 유형 {prop: string}obj 일 수 없습니다. i이 유형 {prop: string}이다이 경우

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

:

당신은 당신의 기능을 일반적인 기능을 할 수 있습니다.

+0

아니요, 'i'는 'obj'여야합니다 ... ... 추론 엔진이 'fx()'return 문과 'fx (obj)'호출을 코드에서 분석하는 경우에만 .... BTW, 나는 합법적 인 정당한 JavaScript 코드를 처리하고 있으므로 코드를 입력 소스에 맞게 변경할 수 있습니다. 다른 방법으로는 사용할 수 없습니다. –

+0

함수를 일반적인 것으로 만들려고 했습니까? 어떤 타입을 얻었습니까? – zgue

+0

죄송합니다. 제안한대로 제네릭 함수로 변경할 수 없습니다. 1) 유효한 JavaScript 입력을 사용하여 유형을 추론하고 응답의 일반 함수 코드가 유효한 자바 스크립트 구문이 아닙니다. 2) 유효한 Javascript 코드를 제외하고는 어떤 입력을 받는지 제어 할 수 없습니다. –