사용자 정의 TypeScript 정의 파일을 작성할 때 "Module 'name'이 (가) 다음에 유형이 지정되지 않은 모듈로 확인됩니다."오류가 발생 함


89

@type/{name}설치된 NodeJS 패키지 중 하나에 대한 TypeScript 정의 를 찾을 수 없으므로 d.ts파일 을 작성하고 파일을 {project root}\typings폴더에 넣으려고 합니다. 이것은 내가하는 방법입니다.

// My source code: index.ts
import Helper from 'node-helper-lib';


// My definition: \typings\node-helper-lib.d.ts
declare....(something else)

declare module 'node-helper-lib' {
   class Helper { ... }
   export = Helper;
}

그러나 Visual Studio Code는이 오류를 계속 발생시키고 아래에 빨간색 선을 표시합니다 declare module 'node-helper-lib'.

[ts] 기능 보강에서 유효하지 않은 모듈 이름입니다. 모듈 'node-helper-lib'는 '{project path} \ node_modules \ node-helper-lib \ index.js'에있는 유형이 지정되지 않은 모듈로 확인되며 확장 할 수 없습니다.

라이브러리가 유형이 지정되지 않았기 때문에 여기에 타이핑을 추가 할 수 있어야한다는 것이 합법적이지 않습니까?

최신 정보:

나는 사용하고있다 :

  • TypeScript : 2.1.4
  • Visual Studio 코드 : 1.9.1
  • Node JS : 6.9.4
  • Windows 10 x64

답변:


151

실제 해결책은 @hirikarate의 답변에서 @Paleo의 주석에 제공됩니다.

가져 오기는 모듈 선언 에서 선언해야합니다 .

예:

declare module 'node-helper-lib' {
   import * as SomeThirdParty from 'node-helper-lib';
   interface Helper {
       new(opt: SomeThirdParty.Options): SomeThirdParty.Type
   }
   export = Helper;
}

21
어딘가에 문서화되어 있습니까?
chris

12
마침내 이것을 찾는 데 몇 시간이 걸 렸는지 모르겠습니다. 고마워요! 이것은 확실히 더 나은 ... 문서화되어야한다
조나단 그루버을

TypeScript에 좋은 오류 메시지가없는 이유는 무엇입니까?
VitorLuizC

53

몇 번의 시도와 오류 후에 augmentation"다른 모듈 선언과 함께 동일한 파일에서 모듈을 선언" 한다는 의미를 발견했습니다 .

따라서 유형이 지정되지 않은 타사 JavaScript 라이브러리에 대한 정의 파일을 작성 하려면 해당 declare module 'lib-name'파일에 하나만 있어야 하며 'lib-name'은 라이브러리 이름과 정확히 일치해야합니다 (package.json, "에서 찾을 수 있음). 이름 "속성).

반면에 타사 라이브러리에 이미 정의 파일이 .d.ts 포함되어 있고 해당 기능을 확장하려는 경우 생성 한 다른 파일에 추가 정의를 넣을 수 있습니다. 이것을라고 augmenting합니다.

예를 들면 :

// These module declarations are in same file, given that each of them already has their own definition file.
declare module 'events' {
   // Extended functionality
}

declare module 'querystring' {
   // Extended functionality        
}

declare module '...' { ... }

누군가가 같은 질문을 할 경우를 대비하여 여기에 내 발견을 남겨 둡니다. 그리고 내가 뭔가를 놓친 경우 나를 수정하십시오.


1
타사 라이브러리에 이미 정의 파일 .d.ts가 포함되어 있지만이를 무시하고 사용자 지정 파일을 사용하려면 어떻게해야합니까?
Alen Liang

24
나는 완전히 유형이 지정되지 않은 npm 모듈에 대한 정의 파일을 작성하려고합니다. supertest— TypeScript의 불만이 말이되지 않습니다. 선언도없는 것을 어떻게 보완 할 수 없습니까? 나는이 여러 번 같은 사용자 정의 파일을 작성했습니다 생각 ... [ts] Invalid module name in augmentation. Module 'supertest' resolves to an untyped module at '/home/chase/Desktop/projects/formuoli/node_modules/supertest/index.js', which cannot be augmented.- 불행하게도 @types/supertest나는 운 것 같은 ..이 깨진 렌더링 DOM 라이브러리를 포함하여 고장 외모
ChaseMoskal

34
@ChaseMoskal : 파일 .d.ts에서 모든 가져 오기를 선언 모듈 "moduleName"{}으로 이동해야합니다.
Paleo

17
@Paleo 정확히 그랬습니다. 모든 import호출은 declare module 'module' {}범위 내에 있어야합니다 . 오류가 베스트에 오해의 소지가있다
pocesar

2
typescript는 import모듈에 필요한 명령문 declare module을 내부 가 아닌 외부에 넣는 경우 동일한 작업을 수행 합니다. 직관적이지 않은 이상한 행동 (여기에서 소리 쳐서 죄송합니다).
binki

0

나는 그 오류 메시지도 받고 있었다. 나에게 문제는 모듈 선언이있는 기존 유형 정의 파일에서 다른 모듈을 선언하려고한다는 것입니다. 새 모듈 선언을 새 파일로 옮긴 후 오류가 사라졌습니다.


-4

제 경우에는 유형 파일 중 하나에서 다음 선언을 사용하여 모든 비 유형 스크립트 패키지를 사용할 수있었습니다.

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