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

Я читал, как 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.js 'неявно имеет 'any' тип.

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

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

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

6 ответов


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

npm install -D @types/module-name

или, если ошибка установки-попробуйте переписать import to 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 repository), то вы можете сделать эту ошибку уйти, объявив модуль в :

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

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


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

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

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

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

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


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

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": [
    ...
  ]
}