Я сделал очень простую библиотеку, которая содержит .d.ts
( источник ), которая имеет следующую структуру (я опускаю детали, потому что файл работает нормально, вероятно, это проблема конфигурации в моем проекте) :
// Some helper types and interfaces
type TranslationFunction = /* ... */;
export { TranslationFunction };
Затем я делаю npm i -D embed-i18n-webpack-plugin
, чтобы установить пакет в свой собственный проект и создать файл typings/translation.d.ts
для объявления глобальной переменной t
типа TranslationFunction
, например:
import { TranslationFunction } from "embed-i18n-webpack-plugin";
declare const t: TranslationFunction;
Используя VSCode, я могу навести курсор на t
в этом файле, и он говорит мне, что он имеет правильный тип, определенный в моем исходном index.d.ts
. Это означает, что когда я нахожусь в этом файле, он правильно его находит.
В этом же каталоге typings
у меня есть другие файлы, объявляющие константы, но они никогда ничего не импортируют и работают, как ожидается.
Однако, когда я пытаюсь использовать глобальную функцию t
внутри моего кода, я получаю сообщение об ошибке
Cannot find name 't'. ts(2304)
НО, если я просто комментирую импорт внутри моего typings/translation.d.ts
:
// import { TranslationFunction } from "embed-i18n-webpack-plugin";
declare const t: TranslationFunction;
Работает нормально, но так как не знает TranslationFunction
, он сворачивается в any
.
Возможно, файл объявления типа моего пакета неправильный и должен содержать немного declare module
? Я не уверен на 100% в поведении, когда дело доходит до публикации объявлений типов в npm, я обычно использую их в простом TS, поэтому он работает нормально. Это первый раз, когда я использую один файл в другом объявлении типа.
На случай, если это уместно, вот мой tsconfig.json
:
{
"compilerOptions": {
"allowJs": true,
"allowSyntheticDefaultImports": true,
"jsx": "preserve",
"lib": ["dom", "es2017"],
"module": "esnext",
"moduleResolution": "node",
"noEmit": true,
"noUnusedLocals": true,
"noUnusedParameters": false,
"noImplicitAny": false,
"preserveConstEnums": true,
"removeComments": false,
"strictFunctionTypes": false,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"experimentalDecorators": true,
"target": "esnext",
"extendedDiagnostics": true,
"paths": {
"$common/*": ["../Common/*"],
"$config": ["./config"],
"$game/*": ["./src/game/*"],
"$containers/*": ["./src/containers/*"],
"$phaser/*": ["./src/phaser/*"],
"$network/*": ["./src/network/*"],
"$pages/*": ["./src/pages/*"],
"$components/*": ["./src/components/*"],
"$helpers/*": ["./src/helpers/*"],
"$rematch/*": ["./src/rematch/*"],
"$hooks/*": ["./src/hooks/*"],
"$types/*": ["./src/types/*"],
"$src/*": ["./src/*"]
},
"rootDir": ".",
"baseUrl": "."
},
"exclude": ["**/node_modules/*", "build", "coverage"]
}
Наконец, я попробовал кое-что посмотрим, решит ли это мою проблему:
- Копирование содержимого объявления типа моего пакета внутри моего
typings/translate.d.ts
-> Работает нормально - Добавление некоторого случайного
declare module "ember-i18n-webpack-plugin
-> Та же ошибка