Не удалось найти файл объявления для модуля "имя модуля". '/path / to / module-name.js 'неявно имеет тип' any


Я читал, как TypeScript разрешение модуля строительство.

у меня есть следующие репозитории: ts-di. После компиляции структура каталогов выглядит следующим образом:

├── dist
│   ├── annotations.d.ts
│   ├── annotations.js
│   ├── index.d.ts
│   ├── index.js
│   ├── injector.d.ts
│   ├── injector.js
│   ├── profiler.d.ts
│   ├── profiler.js
│   ├── providers.d.ts
│   ├── providers.js
│   ├── util.d.ts
│   └── util.js
├── LICENSE
├── package.json
├── README.md
├── src
│   ├── annotations.ts
│   ├── index.ts
│   ├── injector.ts
│   ├── profiler.ts
│   ├── providers.ts
│   └── util.ts
└── tsconfig.json

в моем пакете.json я написал "main": "dist/index.js".

В Узел.js все работает нормально, но TypeScript:

import {Injector} from 'ts-di';

не удалось найти файл объявления для модуля 'ts-di'. '/path/to/node_modules/ts-di/dist / index.Яш' неявно имеет "любой" тип.

и все же, если я импортирую следующим образом, то все работает:

import {Injector} from '/path/to/node_modules/ts-di/dist/index.js';

что я делаю не так?

6 68

6 ответов:

еще два способа, когда модуль не твое - просто попробуйте установить его из @types:

npm install -D @types/module-name

или, если установка ошибочна-попробуйте переписать import до require:

// import * as yourModuleName from 'module-name';
const yourModuleName = require('module-name');

это чувство, когда вы смотрите в течение двух дней и найти его так: просто удалить .js С "main": "dist/index.js" на package.json и все работает отлично!

"main": "dist/index",

UPD: этот ответ относительный, если у вас есть свой собственный пакет npm, если нет - см. мой ответ ниже.

и если выше ответ не разрешен импорт модуля, попробуйте просто добавить typings на package.json:

"main": "dist/index",
"typings": "dist/index",

конечно, вот папка dist - это где магазины файлы вашего модуля.

если вы импортируете сторонний модуль 'foo' это не обеспечивает никаких типизаций, ни в самой библиотеке, ни в @types/foo пакет (генерируется из DefinitelyTyped репозиторий), то вы можете сделать эту ошибку уйти, объявив модуля в .d.ts file:

// foo.d.ts
declare module 'foo';

затем, когда вы импортируете foo он будет просто набран как any.


кроме того, если вы хотите свернуть свой собственный typings, вы можете сделать это, тоже:

// foo.d.ts
declare module 'foo' {
    export function getRandomNumber(): number
} 

тогда это будет компилироваться правильно:

import { getRandomNumber } from 'foo';
const x = getRandomNumber(); // x is inferred as number

вам не нужно предоставлять полные типы для модуля, достаточно только для битов, которые вы фактически используете (и хотите правильные типы), поэтому это особенно легко сделать, если вы используете довольно небольшое количество API.


С другой стороны, если вы не заботитесь о типизациях внешних библиотек и хотите, чтобы все библиотеки без типизаций импортировались как any, вы можете добавить это к .d.ts file:

declare module '*';

преимуществом (и недостатком) этого является то, что вы можете импортировать абсолютно все, и TS будет компилироваться.

TypeScript в основном реализует правила и добавляет типы в ваш код, чтобы сделать его более ясным и точным из-за отсутствия ограничений в Javascript. TypeScript требует от вас описания ваших данных, чтобы компилятор мог проверить ваш код и найти ошибки. Компилятор сообщит вам, если вы используете несоответствующие типы, если вы находитесь вне своей области или пытаетесь вернуть другой тип. Поэтому, когда вы используете внешние библиотеки и модули с TypeScript, они должны содержат файлы, описывающие типы в этом коде. Эти файлы называются тип объявления файлов с пристройкой d.ts. Большинство типов объявлений для модулей npm уже написаны, и вы можете включить их с помощью npm install @types/module_name (где module_name-это имя модуля, типы которого вы хотите включить).

однако, есть модули, которые не имеют своих определений типов и для того, чтобы сделать ошибку уйти и импортировать модуль с помощью import * as module_name from 'module-name' создать папка typings в корне вашего проекта, внутри создать новую папку с именем модуля и в этой папке создать и писать declare module 'module_name'. После этого просто идите к своему tsconfig.json файл и добавить "typeRoots": [ "../../typings", "../../node_modules/@types"] на compilerOptions (С правильным относительным путем к вашим папкам), чтобы TypeScript знал, где он может найти определения типов ваших библиотек и модулей и добавить новое свойство "exclude": ["../../node_modules", "../../typings"] в файл. Вот пример того, как ваш tsconfig.JSON-файл должен выглядеть например:

{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "sourceMap": true,
        "outDir": "../dst/",
        "target": "ESNEXT",
        "typeRoots": [
            "../../typings",
            "../../node_modules/@types"
        ]
    },
    "lib": [
            "es2016"
    ],
    "exclude": [
        "../../node_modules",
        "../../typings"
    ]
}

таким образом, ошибка исчезнет, и вы сможете придерживаться последних правил ES6 и TypeScript.

Я решил эту проблему просто делаю это:

import * as foo from "foo";

в моем случае, эта проблема возникла когда я пытался использовать класс по умолчанию экспортируются библиотекой.

у меня была такая же проблема и я решил ее путем обновления tsconfig.json ' s compilerOptions таким образом:

{
  "compilerOptions": {
    ...
    "noImplicitAny": false,
    ...
  },
  "exclude": [
    ...
  ]
}