모듈 'module-name'에 대한 선언 파일을 찾을 수 없습니다. '/path/to/module-name.js'에는 암시 적으로 'any'유형이 있습니다.


303

TypeScript 모듈 확인 방법을 읽었습니다 .

@ ts-stack / 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

내 package.json에서 나는 썼다 "main": "dist/index.js".

Node.js에서는 모든 것이 잘 작동하지만 TypeScript는 다음과 같습니다.

import {Injector} from '@ts-stack/di';

모듈 '@ ts-stack / di'에 대한 선언 파일을 찾을 수 없습니다. '/path/to/node_modules/@ts-stack/di/dist/index.js'에는 암시 적으로 'any'유형이 있습니다.

그러나 다음과 같이 가져 오면 모든 것이 작동합니다.

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

내가 뭘 잘못하고 있죠?

답변:


295

다른 두 가지 해결책이 있습니다.

모듈이 아닌 경우- @types다음 에서 유형을 설치하십시오 .

npm install -D @types/module-name

위의 설치 오류가 발생하면 import명령문을 require다음 과 같이 변경하십시오 .

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

13
이름을 찾을 수 없다면 TypeScript 2.0에서 이것을 실행하십시오 :npm install @types/node --save-dev
Ogglas

120
모듈에 @types 패키지가 없으면 어떻게됩니까?
Daniel Kmak

37
require대신에 사용 하는 import것이 약간의 반 패턴 이라고 생각 .d.ts합니다. 파일에 모듈을 선언하는 것이 좋습니다 . 아래 내 답변을 참조하십시오.
Retsam

2
사용법 예 : const mdbreact = require('mdbreact'); const { Button, Card, CardBody, CardText, CardTitle, CardImage } = mdbreact;
Sgedda

1
이것은 좋지 않은 조언입니다. 이것은 TypeScript의 요점과 "충분히 쉬운 무언가가 기여할 가치가있다"라는 일반적인 FOSS 태도를 완전히 무시합니다. 타이핑이 누락 된 경우 누군가를 검색하여 입력 한 내용을 게시하거나 제출하지 않은 경우 또는 타이핑 시스템을 사용하지 않으려면 타이핑 시스템을 사용하지 마십시오.
Dave Mackintosh

265

'foo'라이브러리 자체 또는 @types/foo패키지 ( DefinitelyTyped 리포지토리 에서 생성 된)에서 입력을 제공하지 않는 타사 모듈 을 가져 오는 경우 모듈 을 선언하여이 오류를 해결할 수 있습니다. .d.ts확장자를 가진 파일 . TypeScript는 .d.ts파일의 .ts"files", "include"및 "exclude"에 지정된 일반 파일 과 동일한 위치에서 파일을 찾습니다 tsconfig.json.

// 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을 가진 파일에 이것을 추가 할 수 있습니다 .d.ts.

declare module '*';

이것의 장점 (및 단점)은 절대적으로 아무것도 가져올 수 있고 TS가 컴파일한다는 것입니다.


27
컴파일러는 d.ts파일을 어디에서 찾 습니까? typeRoots? 와 같은 구성을 제공해야 합니까?
Tom

17
@ 톰이를 찾습니다 .d.ts정상을 찾을 것이다 것과 같은 장소에서 파일 .ts파일 : "포함", "파일"을 지정하고,에서 "제외"로 tsconfig.json. typeRoots이 용도로 는 사용하지 않는 것이 좋습니다 . node_modules/@types개별 .d.ts파일이 아닌 외부 유형 모듈 (예 :)의 위치를위한 것입니다 .
Retsam

3
"파일 foo.d.ts는 모듈이 아닙니다"
Nathan H

2
이 와일드 카드 파일은 "typings.d.ts"라고해야합니다.
jacob

4
.d.ts파일을 어디에 두어야 합니까?
tonix December

127

빠른 수정이 필요한 경우 가져 오기 행 앞에 간단히 추가하십시오.

// @ts-ignore

7
고마워, 내 사건에 가장 유용한 답변.
David

이후 버전의 eslint에서 오류가 발생합니다.error Do not use "// @ts-ignore" comments because they suppress compilation errors @typescript-eslint/ban-ts-ignore
Hykilpikonna

91

바로 제거 : 당신이 이틀 동안 찾고과 같이 그것을 발견 할 때 느끼는 그 .js에서 "main": "dist/index.js"package.json모든 것이 잘 작동합니다!

"main": "dist/index",

UPD :이 대답은 npm 패키지가있는 경우에 상대적인 것입니다 .

위의 대답은 수입 모듈을 해결되지 않을 경우에, 다만 추가 시도 typings에서 package.json:

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

물론 여기 폴더 dist-모듈의 파일을 저장하는 곳입니다.


마지막 날에 귀하의 질문과 답변에 여러 번 왔으며 누락 된 것은 .d.ts 파일에 해당 유형을 선언하는 것이기 때문에 추가하고 싶습니다. 유형 "선언 모듈 'MYDesiredModule'작성하여 해당 파일에 선언하여 작업을 시작했다 (그리고 나는 그들의 유형을 명시 적으로 설치 할 수 없습니다)
후안

감사. 내 package.json에 "typings": "dist / index"를 추가하면 저에게 효과적이었습니다. TypeScript를 사용하지 않아도 VS 코드에서 typescript 오류가 발생하는 이상한 현상
phocks

통찰력에 감사드립니다! 정의로 이동하려고하면 VS 코드 정의가 내 npm 패키지에서 작동하지 않는 이유를 알려주시겠습니까? 나는 여기에 질문을 작성에는 지금까지 운이 ... 없었습니다 stackoverflow.com/questions/59128917/...
tonix을

dist 폴더에 "index.d.ts"파일을 추가 declare module "moduleName" 하고 그 사이에 넣으 십시오
Sunny Sun

42

TypeScript는 기본적으로 규칙을 구현하고 코드에 유형을 추가하여 Javascript의 제약 조건이 없기 때문에보다 명확하고 정확하게 작성합니다. TypeScript에서는 컴파일러가 코드를 확인하고 오류를 찾을 수 있도록 데이터를 설명해야합니다. 범위를 벗어 났거나 다른 유형을 반환하려고하면 컴파일러에서 일치하지 않는 유형을 사용하고 있는지 알려줍니다. 따라서 TypeScript와 함께 외부 라이브러리 및 모듈을 사용하는 경우 해당 코드의 유형을 설명하는 파일이 포함되어 있어야합니다. 이러한 파일을 확장자가있는 형식 선언 파일 이라고 합니다d.ts . npm 모듈에 대한 대부분의 선언 유형은 이미 작성되었으며 다음을 사용하여 포함 할 수 있습니다 npm install @types/module_name(여기서 module_name은 유형을 포함하려는 모듈의 이름입니다).

그러나, 그들의 유형 정의를 가지고 오류를 확인하기 위해 멀리 가서 사용하여 모듈을 수입하지 않는 모듈이있다 import * as module_name from 'module-name', 폴더를 만들고 typings프로젝트의 루트에, 내부 모듈의 이름으로하고 있다는 점에서 새 폴더를 만들 수는 폴더는 module_name.d.ts파일을 작성하고 씁니다 declare module 'module_name'. 그런 다음 tsconfig.json파일 로 이동 "typeRoots": [ "../../typings", "../../node_modules/@types"]하여 compilerOptions(폴더의 적절한 상대 경로와 함께) 라이브러리에 추가하여 라이브러리 및 모듈의 유형 정의를 찾고 "exclude": ["../../node_modules", "../../typings"]파일에 새 속성 을 추가 할 수있는 위치를 TypeScript에 알립니다 . 다음은 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 규칙을 고수 할 수 있습니다.


타이핑 파일 이름을 지정한 경우에만 효과가있었습니다 index.d.ts. 그 외에는 이것이 나를 위해 일한 유일한 솔루션이었습니다.
Chris Haines

21

다른 사람이 이것을 읽으려면 .js 파일의 이름을 .ts로 바꾸십시오.

편집 : "allowJs": truetsconfig 파일에 추가 할 수도 있습니다 .


예, "반응 융합 차트"와 같은 문제가 있었으며이 솔루션은 매력처럼 작동했습니다.
하품 팬텀

16

이 방법은 저에게 효과적입니다.

1. index.d.ts와 같은 선언 파일에 자신의 선언을 추가하십시오 (프로젝트 루트 아래에있을 수 있음)
declare module 'Injector';
2. index.d.ts를 tsconfig.json에 추가하십시오.
  {
    "compilerOptions": {
        "strictNullChecks": true,
        "moduleResolution": "node",
        "jsx": "react",
        "noUnusedParameters": true,
        "noUnusedLocals": true,
        "allowSyntheticDefaultImports":true,
        "target": "es5",
        "module": "ES2015",
        "declaration": true,
        "outDir": "./lib",
        "noImplicitAny": true,
        "importHelpers": true
      },
      "include": [
        "src/**/*",
        "index.d.ts",   // declaration file path
      ],
      "compileOnSave": false
    }

-편집 : 모듈 이름 주위에 필요한 따옴표


4

typescript로 작성된 반응 응용 프로그램과 함께 노드 모듈을 사용하는 것과 동일한 문제가있었습니다. 를 사용하여 모듈이 성공적으로 설치되었습니다 npm i --save my-module. 자바 스크립트로 작성되었으며 Client클래스를 내 보냅니다 .

와:

import * as MyModule from 'my-module';
let client: MyModule.Client = new MyModule.Client();

오류가 발생하여 컴파일이 실패합니다.

Could not find a declaration file for module 'my-module'. 
'[...]/node_modules/my-module/lib/index.js' implicitly has an 'any' type.
  Try `npm install @types/my-module` if it exists or add a new declaration (.d.ts) file containing `declare module 'my-module';`

@types/my-module존재하지 않으므로 가져온 줄 my-module.d.ts옆에 my-module제안 된 줄과 함께 파일을 추가했습니다 . 그런 다음 오류가 발생했습니다.

Namespace '"my-module"' has no exported member 'Client'.

클라이언트는 실제로 내 보내며 js 앱에서 사용하면 정상적으로 작동합니다. 또한 이전 메시지는 컴파일러가 올바른 파일을 찾고 있음을 알려줍니다 ( 요소에 /node_modules/my-module/lib/index.js정의되어 있음 my-module/package.json "main").

컴파일러에 암시 적으로 신경 쓰지 말라고 anyfalse, tsconfig.json파일 의 다음 줄로 설정 하여 문제를 해결했습니다 .

    "noImplicitAny": false,

14
내 말은, 이것이 효과가 있지만 나머지 코드를 엄격하게 입력 할 수있는 능력을 잃고 있습니다. 훌륭한 해결 방법이 아닙니다.
phillyslick

3

다시 고치는 간단한 :

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

객체의 인터페이스를 선언하려면 (큰 프로젝트에 권장) 다음을 사용할 수 있습니다.

// example.d.ts
declare module 'foo'{
    // example
    export function getName(): string
}

그것을 사용하는 방법? 단순한..

const x = require('foo') // or import x from 'foo'
x.getName() // intellisense can read this

2

모듈과 유형이 이미 설치되어 있고 IDE를 여러 번 다시로드 하더라도이 문제가 발생하여 잠시 당황했습니다.

필자의 경우 해결 한 것은 터미널 프로세스를 종료 node_modules하고을 제거하고 노드 패키지 관리자 캐시를 지우고 새로 고친 install다음 편집기를 다시로드하는 것입니다.


2

불행히도 패키지 라이터가 선언 파일을 방해하는지 여부는 우리의 손에 달려 있습니다. 내가하는 경향이있는 파일은index.d.ts 은 다양한 패키지에서 누락 된 선언 파일을 모두 포함 있습니다.

Index.ts :

declare module 'v-tooltip';
declare module 'parse5';
declare module 'emoji-mart-vue-fast';


0

여기에서 모든 것을 시도했지만 완전히 다른 문제였습니다. 내 *.d.ts수입 명세서 에서 제거해야했습니다 .

import { SomeModuleType } from '3rd-party-module';

오류를 제거한 후 사라졌습니다 ...

설명 : *.d.ts파일 에서 모듈을 선언 하면 Typescript 컴파일러가 주변 모듈 (명시 적으로 가져올 필요가없는 모듈) 로 자동 선택됩니다 . 를 지정하면 import ... from ...파일이 이제 일반 (ES6) 모듈이되므로 자동으로 선택되지 않습니다. 따라서 여전히 앰비언트 모듈 로 동작 하려면 다음과 같이 다른 가져 오기 스타일을 사용하십시오.

type MyType: import('3rd-party-module').SomeModuleType;

-4

간단히 다음 코드와 같이 require를 사용하여 가져올 수 있습니다.

var _ = require('your_module_name');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.