2017-03-02 10 views
2

나는 이해하려고 노력 중이 야. (w3schools에 따른, ES6 기능 임)ES5/ES3를 타켓팅 할 때 Typescript는 무엇을 나타낼 것입니까? 타이프 스크립트 컴파일러 내 지정된 목표 인 ECMAScript 버전 (ES5 또는 ES3)와 호환되도록하는 코드를 transpile 때

예를 들어, TSC는 for(var int of intArray) 벌금 transpile 않겠지 만 Number.isInteger()을 transpile 않는다.

Number.isInteger()

는 IE < 11.0에서 지원되지 않으므로이 문제입니다. Visual Studio (및 VS 코드)는 비 호환성에 대한 경고를 제공하지 않으며 번역되지 않습니다.

무엇 transpiled 얻을 내가 기대하고 무엇을하지 않습니다? 나는 처음에 모든 것이 내가 이런 것들을 추적 할 필요가 없습니다 것입니다, 그래서 transpiled 될 수 있지만, 그런 경우가 될 것 같지 않습니다 것으로 예상.

+0

나는 TS가 'Promise '유형과 매우 비슷하다고 생각합니다. 즉, 입력 했으므로 이미 polyfill을 사용하고 있다고 가정합니다. 'Number.isInteger'는 trifially polyfilled이지만, polyfills는 TS가하고 싶어하는 것이 아닙니다. 예를 들어 [polyfills에 대한이 주석] (https://github.com/Microsoft/TypeScript/issues/4031#issuecomment-125712496)을 참조하십시오. –

+1

이 경우 IDE가 내 코드의 타겟이 아닌 ECMAScript 버전과의 비 호환성을 알리면 좋을 것입니다. Visual Studio가 나에게 제공했기 때문에 Number.isInteger()를 사용하기 시작했고 많은 (상대적으로 현대적인) 브라우저가이를 지원하지 않는다는 사실을 나중에 알게되었습니다. 다른 "지뢰"가 무엇을 기다리고 있는지 확실하지 않습니다! – JoshMB

+0

아마 당신이 브라우저를 알기 전까지는 실종 될 수있는 많은 것들을 polyfills하는 [es6-shim] (https://github.com/paulmillr/es6-shim)과 같은 것을 사용하는 것이 좋습니다. 타겟팅은 모든 기능을 지원합니다. –

답변

3

컴파일러 사용하도록 지시 lib 디렉토리에 따라 기능을 지원합니다.
targetlibcompiler options를 사용하여 컴파일러가 사용할에서는 lib 제어하는 ​​방법은 두 가지가 있습니다. 이 위의 링크로 작성으로

: --lib는 기본 라이브러리를 지정하지 않으면

가 주입된다. 주입 된 기본 라이브러리는 다음과 같습니다 --target ES5를 들어
► : DOM, ES5, ScriptHost
► --target ES6의 경우 : DOM, ES6, DOM.Iterable, ScriptHost

다른 모든 libs는 part of the project입니다.

당신은 당신이 (당신이 언급 한 바와 같이) 그것이 es6 기능의로 Number.isInteger()을 사용할 수 없습니다 es3 또는 es5을 대상으로하는 경우.
당신은 여전히 ​​es6 lib 디렉토리에 es5을 대상 수에 대한 polyfil이있는 경우 :

--target es5 --lib DOM,ES6,ScriptHost 

아니면 그냥 lib.es6.d.ts에 대한 정의를 복사 할 수 있습니다 :

interface NumberConstructor { 
    isInteger(number: number): boolean; 
} 

이유를 당신은 대상에 관계없이 let, const, for/of 같은 것을 사용할 수 있다는 것은 컴파일러가 동등한 코드를 생성하는 방법을 알고 있다는 것입니다 선택한 대상에 해당 기능이 지원되지 않는 경우에도 마찬가지입니다. 대상을 지정하지 않으면

var arr = [1, 2, 3]; 
for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) { 
    var num = arr_1[_i]; 
} 

: 예를 들어

:

const arr = [1, 2, 3]; 
for (let num of arr) {} 

가로 컴파일됩니다.
보시다시피 constletvar으로 바뀌고 for/in은 일반 for으로 바뀝니다.

Number.isInteger()은 다른 대상이며, 특정 대상에 존재하지 않는 기능입니다 (예 : Promise 및 'Symbol').
컴파일러는 polyfill을 추가하지 않습니다. 컴파일러에게 polyfill을 추가하지 말고 컴파일러에게 알려줍니다.

+0

답변 해 주셔서 감사합니다. 내가 찾고있는 것은 기능의 범주가 넘어 지는지 여부를 알 수있는 방법입니다. 필자는 Typescript 프로젝트에서 작업하는 사람들에게 이해가 될 것이라고 확신하지만 현재로서는 나에게 무작위로 나타납니다. 결과적으로 추측과 확인의 게임이됩니다. 왜'for (int int의 var int)'가'Number.isInteger()'와 근본적으로 다른가? – JoshMB

+0

오. 거기에 좋은 묘사가 있습니다. 수정 된 답변을 확인하십시오. –