Машинопись. Не удалось найти объявление окружения при импорте пакета npm для модуля / подкаталога - PullRequest
0 голосов
/ 09 ноября 2018

Я разрабатываю библиотеку с именем 'vee-type-safe' для проверки типов во время выполнения. Все работало прекрасно, пока я не добавил подкаталог /express и файл /express/index.ts, куда я экспортировал некоторые фабрики проверки типа промежуточного программного обеспечения ExpressJS. Итак, у меня есть следующая структура:

vee-type-safe
|- build
|- package.json
|- declarations
|  |- is-iso-date.d.ts
|
|- tsconfig.json
|- index.ts       // lightweight core library
|- express
   |-index.ts     // express middleware factories

В express/index.ts файле я импортирую модуль ядра '../index.ts' библиотеки. В моем основном модуле у меня есть следующий импорт:

import isISODate = require('is-iso-date');
В пакете

'is-iso-date' нет наборов, поэтому я создал каталог declarations с is-iso-date.d.ts, который так прост:

declare module 'is-iso-date' {
    function isISODate(suspect: string): boolean;
    export = isISODate;
}

Я добавил "typeRoots": [ ..., "declarations"] к tsconfig.json

Я добавил "types": "build/index.d.ts" к package.json

Когда я запускаю tsc в моем пакете, все компилируется без ошибок. Но когда я устанавливаю свою библиотеку 'vee-type-safe' в качестве зависимости от какого-либо проекта через npm и пытаюсь скомпилировать ее, я получаю следующую ошибку:

Could not find a declaration file for module 'is-iso-date'. 
'/home/tegeran/projects/is-iso-date-issue/node_modules/is-iso-date/index.js'
implicitly has an 'any'type.
Try `npm install @types/is-iso-date` if it exists or add a new declaration (.d.ts)
file containing `declare module 'is-iso-date';`

1 import isISODate = require('is-iso-date');

Это происходит только при импорте субмодуля 'vee-type-safe/express'. Когда я импортирую свой основной модуль 'vee-type-safe', ошибок не возникает. Что мне здесь не хватает? Я создал репозиторий github с минимальным проектом, чтобы продемонстрировать эту ошибку

1 Ответ

0 голосов
/ 11 ноября 2018

Когда вы запускаете tsc во внешнем проекте, файл tsconfig.json для vee-type-safe не действует, поэтому ничто не заставляет tsc загрузить vee-type-safe/declarations/is-iso-date.d.ts. Для импорта vee-type-safe это нормально, потому что поле types vee-type-safe/package.json перенаправляет на vee-type-safe/build/index.d.ts, что не относится к is-iso-date, поскольку vee-type-safe/index.ts использует is-iso-date только в реализации и не выставлять любые виды из него. Однако импорт vee-type-safe/express обходит vee-type-safe/package.json и загружает vee-type-safe/express/index.ts напрямую, и этот файл импортирует vee-type-safe/index.ts, который импортирует is-iso-date, и вы получаете ошибку. Что еще более важно, импорт vee-type-safe/express не будет работать во время выполнения, поскольку он не преобразуется в файл .js.

У вас есть несколько способов исправить это, но ни один из них не хорош:

  1. (Исключен)
  2. Имейте внешний проект import vee-type-safe/build/express, который разрешит к vee-type-safe/build/express/index.d.ts.
  3. Удалите параметр outDir из vee-type-safe, чтобы файлы .d.ts создавались вместе с файлами .ts.
  4. Перенаправьте vee-type-safe/express (и каждый путь субмодуля, который вы хотите, чтобы другие проекты могли импортировать) по отдельности в соответствующие файлы в build, вручную создавая пару файлов .js и .d.ts, которые импортируют реальные пути или файл package.json с полями main и types, которые ссылаются на реальные пути. (Обновление: похоже, что main достаточно, потому что TypeScript попытается изменить расширение пути main.)

См. этот выпуск для дополнительного обсуждения.

...