컴파일러 사용하도록 지시 lib 디렉토리에 따라 기능을 지원합니다.
target
및 lib
compiler 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) {}
가로 컴파일됩니다.
보시다시피 const
및 let
은 var
으로 바뀌고 for/in
은 일반 for
으로 바뀝니다.
Number.isInteger()
은 다른 대상이며, 특정 대상에 존재하지 않는 기능입니다 (예 : Promise
및 'Symbol').
컴파일러는 polyfill을 추가하지 않습니다. 컴파일러에게 polyfill을 추가하지 말고 컴파일러에게 알려줍니다.
나는 TS가 'Promise'유형과 매우 비슷하다고 생각합니다. 즉, 입력 했으므로 이미 polyfill을 사용하고 있다고 가정합니다. 'Number.isInteger'는 trifially polyfilled이지만, polyfills는 TS가하고 싶어하는 것이 아닙니다. 예를 들어 [polyfills에 대한이 주석] (https://github.com/Microsoft/TypeScript/issues/4031#issuecomment-125712496)을 참조하십시오. –
이 경우 IDE가 내 코드의 타겟이 아닌 ECMAScript 버전과의 비 호환성을 알리면 좋을 것입니다. Visual Studio가 나에게 제공했기 때문에 Number.isInteger()를 사용하기 시작했고 많은 (상대적으로 현대적인) 브라우저가이를 지원하지 않는다는 사실을 나중에 알게되었습니다. 다른 "지뢰"가 무엇을 기다리고 있는지 확실하지 않습니다! – JoshMB
아마 당신이 브라우저를 알기 전까지는 실종 될 수있는 많은 것들을 polyfills하는 [es6-shim] (https://github.com/paulmillr/es6-shim)과 같은 것을 사용하는 것이 좋습니다. 타겟팅은 모든 기능을 지원합니다. –