Как использовать новые пакеты @types для типизации TypeScript?

Я начал переносить большое существующее приложение TypeScript на основе namespace и <reference> для использования modules и @types репозитория NPM. Тем не менее, я сталкиваюсь с проблемами каждую секунду.

  1. Во многих библиотеках даже нет типов.
  2. Многие библиотеки имеют полностью устаревшие типизации.
  3. Во многих библиотеках есть файл global типизации, в результате чего я не могу его import, потому что TS жалуется, что это не модуль.
  4. Когда в библиотеке есть файл ввода в форме module, правильно включенный в пакет NPM (например, moment.js), TS по-прежнему не может его найти, и в строке import * as moment from 'moment' сообщается, что модуль не найден.

Каково текущее состояние этой техники? На первый взгляд, мне кажется, что это далеко не готово к производству.

Каковы хаки и методы для решения этих проблем?

Я нацелен на es5 и использую es6 в качестве конфигурации modules. Может ли это быть проблемой? Насколько я знаю, TS также поддерживает синтаксис модуля es6 для вывода es5.


person Zoltán Tamási    schedule 04.01.2017    source источник


Ответы (1)


Текущий способ работы определенно готов к производству; однако есть несколько неочевидных вещей, и это не ваша вина.

Позвольте мне попытаться ответить на ваши вопросы один за другим.

  1. Во многих библиотеках даже нет типов.

В TypeScript 2.1, если у вас установлен пакет в node_modules и у вас не включен noImplicitAny, вы можете просто импортировать все, что хотите.

Если вы хотите использовать noImplicitAny (что я бы порекомендовал для любого проекта, который, как вы ожидаете, со временем будет расти), вы всегда можете просто создать declarations.d.ts в исходной папке вашего проекта, которая объявляет модули по мере необходимости:

// do anything you want when you import `"foo"` now.
declare module "foo";

// can only access the `hello` export when importing `"bar"`.
declare module "bar" {
    export var hello;
}
  1. Многие библиотеки имеют полностью устаревшие типизации.

Вы определенно можете свободно отправлять запрос на извлечение в DefinitelyTyped, но если вы действительно ограничены во времени, вы можете просто использовать подход, который я дал для пункта (1).

  1. Во многих библиотеках есть файл global типизации, в результате чего я не могу import его import, потому что TS жалуется, что это не модуль.

Если вам нужно использовать файл глобального объявления из DefinitelyTyped, и он не включается автоматически в ваш проект, возможно, вам придется добавить его в поле types в файле tsconfig.json. См. мой другой ответ здесь, но Суть в том, что если вам нужно включить глобальные объявления для пакетов foo и bar, и у вас установлены @types/foo и @types/bar, вы можете написать следующее в файле tsconfig.json.

{
    "compilerOptions": {
        "types": ["foo", "bar"]
    }
}
  1. Когда в библиотеке есть файл ввода в форме module, правильно включенный в пакет NPM (например, moment.js), TS по-прежнему не может его найти, и в строке import * as moment from 'moment' сообщается, что модуль не найден.

Я считаю, что это связано с тем, что вы ориентируетесь на ES6. Попробуйте изменить параметр "moduleResolution" на "node" в tsconfig.json.

{
    "compilerOptions": {
        "moduleResolution": "node"
    }
}

Извините, что это глюк. Причина в том, что единственная система загрузки модулей, которая на самом деле имеет эту семантику разрешения, — это CommonJS (стратегия, которую использует Node). Я согласен, что это можно улучшить.

person Daniel Rosenwasser    schedule 04.01.2017
comment
Спасибо за подробный ответ, мне очень приятно. Завтра я еще раз взгляну на весь мой текущий беспорядок и дам некоторые отзывы. - person Zoltán Tamási; 04.01.2017
comment
Еще раз спасибо, я приму ваш ответ, поскольку он технически отвечает на мои вопросы и дал мне несколько хороших советов. Однако я застрял с дополнительным вопросом, пожалуйста, посмотрите его здесь, если у вас есть несколько минут. stackoverflow.com/questions/41474704/ - person Zoltán Tamási; 05.01.2017