Có lỗi “Tên 'mô-đun' giải quyết thành mô-đun không được định kiểu tại…” khi viết tệp định nghĩa TypeScript tùy chỉnh


89

Tôi không thể tìm thấy định nghĩa TypeScript @type/{name}cho một trong các gói NodeJS đã cài đặt của mình, vì vậy tôi cố gắng viết một d.tstệp cho nó và đặt tệp vào {project root}\typingsthư mục. Đây là cách tôi làm:

// 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;
}

Tuy nhiên, Visual Studio Code tiếp tục gây ra lỗi này và đặt dòng màu đỏ dưới declare module 'node-helper-lib':

[ts] Tên mô-đun không hợp lệ trong phần tăng thêm. Mô-đun 'node-helper-lib' phân giải thành mô-đun chưa được định kiểu tại '{project path} \ node_modules \ node-helper-lib \ index.js', không thể tăng thêm.

Không phải là hợp pháp vì thư viện chưa được định kiểu, vì vậy tôi nên được phép thêm nhập vào nó?

CẬP NHẬT:

Tôi đang dùng:

  • TypeScript: 2.1.4
  • Mã Visual Studio: 1.9.1
  • Node JS: 6.9.4
  • Windows 10 x64

Câu trả lời:


151

Giải pháp thực tế được đưa ra trong một bình luận của @Paleo trong câu trả lời của @ hirikarate:

Nhập phải được khai báo bên trong khai báo mô-đun.

Thí dụ:

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

22
Điều này có được ghi ở đâu đó không?
chris

13
Tôi không biết cuối cùng tôi đã mất bao nhiêu giờ để tìm ra thứ này. Cảm ơn rất nhiều! Điều này chắc chắn nên được ghi chép tốt hơn ...
Jonathan Gruber

1
Tại sao TypeScript không có một thông báo lỗi hay một cái gì đó tương tự?
VitorLuizC

53

Sau một số lần thử và gặp lỗi, tôi thấy điều đó augmentationcó nghĩa là "khai báo một mô-đun trong cùng một tệp với (các) khai báo mô-đun khác".

Do đó, nếu chúng ta muốn viết tệp định nghĩa cho thư viện JavaScript của bên thứ 3 không được định kiểu, chúng ta phải CHỈ CÓ MỘT declare module 'lib-name'trong tệp đó và 'lib-name' phải khớp chính xác với tên thư viện (có thể tìm thấy trong package.json của nó, " tên "tài sản).

Mặt khác, nếu thư viện của bên thứ 3 đã .d.ts bao gồm tệp định nghĩa và chúng tôi muốn mở rộng các chức năng của nó, thì chúng tôi có thể đặt định nghĩa bổ sung vào tệp khác mà chúng tôi tạo. Cái này được gọi là augmenting.

Ví dụ:

// 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 '...' { ... }

Tôi để lại khám phá của mình ở đây chỉ trong trường hợp ai đó có cùng câu hỏi. Và xin vui lòng sửa cho tôi nếu tôi bỏ lỡ điều gì đó.


1
Tôi nên làm gì nếu thư viện của bên thứ 3 đã bao gồm tệp định nghĩa .d.ts, nhưng tôi muốn bỏ qua nó và sử dụng tệp tùy chỉnh?
Alen Liang

24
Tôi đang cố gắng viết một tệp định nghĩa cho một mô-đun npm hoàn toàn không được định kiểu, supertest- Lời phàn nàn của TypeScript thậm chí không có ý nghĩa, làm thế nào tôi có thể không bổ sung một cái gì đó thậm chí không có khai báo? Tôi nghĩ rằng tôi đã viết các tệp định nghĩa tùy chỉnh như thế này nhiều lần ... [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.- thật không may @types/supertestlà bị hỏng do bao gồm các thư viện DOM khiến nó bị hỏng .. có vẻ như tôi đã gặp may
ChaseMoskal

34
@ChaseMoskal: Trong tệp của bạn .d.ts, có thể bạn chỉ nên chuyển tất cả quá trình nhập vào mô-đun khai báo "moduleName" {}.
Paleo

17
@Paleo chính xác là như vậy, tất cả các importlệnh gọi phải đi vào declare module 'module' {}phạm vi bên trong . lỗi là gây hiểu nhầm lúc tốt nhất
pocesar

2
typecript thực hiện điều tương tự nếu bạn đặt các importcâu lệnh mà mô-đun của bạn yêu cầu bên ngoài declare modulethay vì bên trong nó. Hành vi kỳ quặc không trực quan như vậy (xin lỗi vì đã trình bày ở đây).
binki

0

Tôi cũng nhận được thông báo lỗi đó. Vấn đề đối với tôi là tôi đang cố gắng khai báo một mô-đun khác trong tệp định nghĩa kiểu hiện có có khai báo mô-đun trong đó. Sau khi tôi di chuyển khai báo mô-đun mới sang tệp mới, lỗi đã biến mất.


-4

Trong trường hợp của tôi, tôi chỉ sử dụng khai báo sau trong một trong các tệp kiểu của mình, vì vậy tôi có thể sử dụng tất cả các gói không phải typecript:

declare module '*'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.