2017-02-05 3 views
1

"target": "es5"으로 컴파일 된 TypeScript 프로젝트가 있습니다. core-js의 Set을 사용하므로 core-js와 @ types/core-js가 프로젝트에 설치되어 있습니다. 그러나 core-js d.ts에는 SetMap (및 기타 ES6 기능)의 전역 선언이 포함되어 있으므로 TypeScript 컴파일러를 사용하면이 매개 변수를 사용할 수 있으므로 이전 브라우저에서는 작동하지 않습니다.core-js 및 대상이있는 Typescript ES5 지원되지 않는 ES6 기능 사용 가능

인터페이스에 분명히 필요하기 때문에 build에서 core.d.ts를 제외 할 수 없습니다.

컴파일러가 ES6 기능을 사용하지 않고 core-j와 해당 유형 정의를 계속 사용하지 못하게 할 방법이 있습니까?

+0

? es6 기능을 사용하지 않으려면 해당 기능에 해당하는 유형이 필요하지 않습니다. –

+0

'Set '을 사용하고 싶습니다. 하지만 저는 글로벌 대체품이 아니라 오히려 도서관으로 core-js를 사용하고 싶습니다. 그래서 나는 "core-js/library/fn/set"에서 coreSet으로 import *를 필요로하는 파일에 포함시켰다. 그래서 새로운 CoreSet ()을 할 수 있습니다. 하지만 문제는'new Set ()'을 수행 할 수 있으며 완벽하게 컴파일 된 후 브라우저에서 실패합니다. – Dina

+0

나는 본다. core-js는 polyfill이므로 선언은 전역 범위를 수정하도록 설계되었습니다. 나는 set 인터페이스에 대한 자신 만의 선언을 찾거나 만들 것을 권하고 싶습니다. 매우 간단합니다. @ types/core-js 패키지를 제거하면 네임 스페이스에 혼란을 초래할 수 있습니다. –

답변

0

core-js는 polyfill이므로 선언은 전역 범위를 수정하도록 설계되었습니다. 설정된 인터페이스에 대한 자신 만의 선언을 찾거나 만들 것을 권장합니다. 매우 간단합니다. @ types/core-js 패키지를 확실히 제거하십시오.

이 당신의 로더에 의해 또는 노드의 해결로 실제 자바 스크립트 파일의 수입 경로와 일치하는 이름을 가진 주위 외부 모듈 선언이라고

declare module "core-js/library/fn/set" { 
    class Set { ... } 
    export = Set; 
} 

주 같을 것이다 사용할 수 선언 기능이 필요합니다.

앰비언트 외부 모듈 선언은 가능한 경우 외부 앰블 모듈의 전역 이름 공간에 기여하기 때문에 피해야합니다.이 경우 피하기가 어렵습니다.

tsconfig.json에서 경로 구성을 사용하는 것을 피할 수있는 한 가지 방법이 있습니다.

당신이 무엇 인터페이스를 경로에 비 - 주변-declaration.ts

class Set { ... } 
export = Set; 

tsconfig.json 필요합니까

{ 
    "compilerOptions": { 
    "baseUrl": "", 
    "paths": { 
     "core-js/library/fn/set": [ 
     "path-to-non-ambient-declaration" 
     ] 
     } 
    } 
    } 
} 
+0

상세한 답변을 보내 주셔서 감사합니다! 그래도 생성자와 문제가 있습니다. 나는 클래스 집합을 정의했다. { \t \t new() : 집합 ; \t \t 새 값 (ArrayLike | 집합 ) : 집합 ; ...' 하지만 새로운 세트 (someOtherSet)을 호출하려고하면 "예상 0 매개 변수가 1로 호출되지만" – Dina

+0

생성자 키워드를 사용하여 생성자를 선언하고 유형 인수를 클래스 자체 또는 대체 요소에 배치합니다 한 쌍의 인터페이스를 사용하는 접근법은 TypeScript 설치 디렉토리에서'lib.es2015.d.ts'를보고, Set 및 SetConstructor에 대한 선언을 포함합니다 –