TypeScript не находит переменную, объявленную в объявлении типа, если я импортирую файл - PullRequest
4 голосов
/ 23 апреля 2020

Я сделал очень простую библиотеку, которая содержит .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 -> Та же ошибка

1 Ответ

3 голосов
/ 26 апреля 2020

Импорт в файлы объявлений и их глобальная доступность немного странный, выглядит так:

declare const t: import("embed-i18n-webpack-plugin").TranslationFunction;

Это все, что вам нужно сделать. Typescript не зарегистрирует объявление как глобальное, если в нем есть традиционный импорт, поэтому вам нужно использовать этот стиль импорта. для этого требуется версия машинописного текста> = 2.9

документы на него: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-9.html#import -типы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...