Текущий способ работы определенно готов к производству; однако есть несколько неочевидных вещей, и это не ваша вина.
Позвольте мне попытаться ответить на ваши вопросы один за другим.
- Во многих библиотеках даже нет типов.
В 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;
}
- Многие библиотеки имеют полностью устаревшие типизации.
Вы определенно можете свободно отправлять запрос на извлечение в DefinitelyTyped, но если вы действительно ограничены во времени, вы можете просто использовать подход, который я дал для пункта (1).
- Во многих библиотеках есть файл
global
типизации, в результате чего я не могу import
его import
, потому что TS жалуется, что это не модуль.
Если вам нужно использовать файл глобального объявления из DefinitelyTyped, и он не включается автоматически в ваш проект, возможно, вам придется добавить его в поле types
в файле tsconfig.json
. См. мой другой ответ здесь, но Суть в том, что если вам нужно включить глобальные объявления для пакетов foo
и bar
, и у вас установлены @types/foo
и @types/bar
, вы можете написать следующее в файле tsconfig.json
.
{
"compilerOptions": {
"types": ["foo", "bar"]
}
}
- Когда в библиотеке есть файл ввода в форме
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