2017-02-05 5 views
1

У меня есть проект TypeScript, который скомпилирован с "target": "es5". Я использую core-js's Set, поэтому у меня есть core-js и @ types/core-js, установленные в моем проекте. Однако, поскольку core-js d.ts включает глобальное объявление Set и Map (и другие функции ES6), компилятор TypeScript позволяет мне использовать их, что, очевидно, не будет работать в старом браузере.core-js и Typcript с целевым ES5 позволяют использовать неподдерживаемые функции ES6

Я не могу исключить core.d.ts из сборки, потому что я, очевидно, нуждаюсь в нем для интерфейсов.

Есть ли способ для компилятора запретить мне использовать функции ES6 и по-прежнему использовать core-js и соответствующие им определения типов?

+0

Какие интерфейсы вам нужно от него? Если вы не хотите использовать функции es6, вам не нужны типы, соответствующие этим функциям. –

+0

Я хочу использовать 'Set'. Но я не хочу использовать core-js как глобальную замену, а скорее как библиотеку. Поэтому у меня есть 'import * в качестве CoreSet из« core-js/library/fn/set »;' в файле, который ему нужен. Поэтому я могу сделать «новый CoreSet ()'. Но проблема в том, что я также могу сделать 'new Set ()', и он отлично компилируется, а затем выходит из строя в браузере. – Dina

+0

Я вижу. Поскольку core-js является полифилом, его объявления предназначены для изменения глобальной области. Я бы порекомендовал вам найти или создать собственное объявление интерфейса, это довольно просто и, безусловно, удалить пакет @ types/core-js, поскольку он приведет к хаосу в вашем пространстве имен. –

ответ

0

Поскольку core-js является полифоном, его объявления предназначены для изменения глобальной области. Я бы порекомендовал вам найти или создать собственное объявление интерфейса, это довольно просто. Определенно удалите пакет @ types/core-js.

Заявление, что вы могли бы использовать как будет выглядеть

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

Обратите внимание, что это эмбиент внешний модуль декларации с именем, которое соответствует пути импорта фактического файла JavaScript в разрешаться заряжающего или узла требуется функция.

При необходимости следует избегать деклараций внешнего внешнего модуля, так как все они способствуют глобальному пространству имен внешних внешних модулей, но в этом случае его трудно избежать.

Одним из способов избежать этого является использование конфигурации путей в вашем tsconfig.json.

путь-к-не-окружающей среды-declaration.ts

class Set { ... } 
export = Set; 

tsconfig.json

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

Спасибо за подробный ответ! Однако у меня проблемы с конструктором. I defined 'class Set { \t \t новый(): Set ; \t \t новый (значения: ArrayLike | комплект ): комплект ; ...' Но когда я пытаюсь вызвать новый Set (someOtherSet), я получаю сообщение об ошибке« ожидаемые 0 параметров, но вызывается с помощью 1 ». – Dina

+0

Используйте ключевое слово конструктора, чтобы объявить конструктор и поместить аргумент типа в сам класс или для альтернативного подход с использованием пары интерфейсов см. в 'lib.es2015.d.ts' в каталоге установки TypeScript, он содержит декларацию для Set и SetConstructor –