nodejs yêu cầu bên trong tệp TypeScript


97

Làm cách nào để tải một mô-đun NodeJS thông thường (từ node_modules) từ bên trong một TypeScriptlớp?

Khi tôi cố gắng biên dịch .tstệp có chứa:

var sampleModule = require('modulename');

Lời nhắc trình biên dịch mà tôi không thể sử dụng yêu cầu trong phạm vi này. (dòng đó ở đầu tệp).


1
Bạn có thể cho chúng tôi xem mã của bạn (mã gốc và mã đã biên dịch) không? Tôi nghĩ rằng requirecó thể được sử dụng ở bất cứ đâu, nó không phụ thuộc vào phạm vi.
— quái đản

Có, nhưng phải được khai báo và không được khai báo trong lib.d.ts mặc định như Valentin đề xuất.
— Zdenek Sejcek

Câu trả lời:


105

Typecript sẽ luôn phàn nàn khi không thể tìm thấy một ký hiệu. Trình biên dịch đi kèm cùng với một tập hợp các định nghĩa mặc định cho window, documentvà như vậy xác định trong một tập tin gọi là lib.d.ts. Nếu tôi thực hiện một grep cho requiretệp này, tôi không thể tìm thấy định nghĩa nào về một hàm require. Do đó, chúng ta phải tự nói với trình biên dịch rằng hàm này sẽ tồn tại trong thời gian chạy bằng declarecú pháp:

declare function require(name:string);
var sampleModule = require('modulename');

Trên hệ thống của tôi, điều này biên dịch tốt.


23
Cảm ơn bạn. Điều này sẽ hoạt động cho tất cả các chức năng không được khai báo. Giải pháp tốt hơn mà tôi đã tìm thấy là lấy node.d.ts từ các mẫu typecript và tham chiếu nó. Hơn bạn có tất cả mọi thứ. Ngoài ra còn có express.d.ts.
— Zdenek Sejcek

2
Tôi nghĩ bạn cũng có thể làm đượcimport sampleModule = module('modulename')
— mpen

Vâng, nhưng node.d.ts hiện đang ở v0.8.8. Tốt hơn nên sử dụng phương pháp của @Valentin và sau đó sử dụng IDE nói rằng WebStorm có thể tải xuống các định nghĩa cho phiên bản Node bạn đang chạy và cung cấp cho bạn tính năng tự động hoàn thành, v.v. trên đó.
— Radek

@Radek Làm thế nào để bạn làm điều đó? Tôi sử dụng WebStorm 7.0.2 (mới nhất) Btw Tôi không tìm thấy tập lệnh node.d.ts, nó nằm ở đâu? Cám ơn.
— Vadorequest

1
@Vadorequest điều này sẽ hữu ích: jetbrains.com/webstorm/webhelp/…
— Radek

61

Cú pháp đúng là:

import sampleModule = require('modulename');

hoặc là

import * as sampleModule from 'modulename';

Sau đó, biên dịch TypeScript của bạn với --module commonjs.

Nếu gói không đi kèm với một index.d.tstệp và nó package.jsonkhông có thuộc "typings"tính, tscnó sẽ sủa rằng nó không biết những gì 'modulename'đề cập đến. Vì mục đích này, bạn cần tìm một .d.tstệp cho nó trên http://definifinitytyped.org/ hoặc tự viết một tệp .

Nếu bạn đang viết mã cho Node.js, bạn cũng sẽ muốn node.d.tstệp từ http://definifinitytyped.org/ .


Tôi đã làm theo phương pháp này, sử dụng "import * as $ s từ 'scriptjs';" vì tôi đang sử dụng TypeScript. Lệnh CKEDITOR.replace () dường như thực thi và tôi nhận được thứ trông giống như một phần tử DOM hợp lệ từ nó, tuy nhiên không có gì thay đổi trong trình duyệt (vẫn là một textarea) và lệnh gọi lại editor.on ('contentDom', ...) của tôi (cũng được cài đặt bên trong $ s callback) không bao giờ được gọi. Có ý kiến ​​gì không?
— Vern Jensen

43

Giải pháp tốt nhất là lấy một bản sao các định nghĩa kiểu của Node. Điều này sẽ giải quyết tất cả các loại vấn đề phụ thuộc, không chỉ require(). Điều này trước đây đã được thực hiện bằng cách sử dụng các gói như typings, nhưng như Mike Chamberlain đã đề cập, Typings không được dùng nữa. Cách hiện đại đang làm như thế này:

npm install --save-dev @types/node

Nó không chỉ giúp sửa lỗi trình biên dịch mà còn thêm các định nghĩa của Node API vào IDE của bạn.


1
Điều này cũng làm việc cho tôi! Nhưng điều tôi không hiểu là tôi đã cài đặt nó trên toàn cầu (tức là npm install -g @types/node:) nhưng điều đó không hoạt động?
— Jeach

Điều gì sẽ xảy ra nếu mô-đun loại không khả dụng trong npm?
— Sudharshan Nair

@SudharshanNair có rất nhiều kiểu được xác định bởi dự án DefiniedlyTyped. Các tùy chọn khác bao gồm contrinuting đến các loại khai báo được nhập chắc chắn trong dự án của riêng bạn hoặc sử dụng không có định dạng loại,
— rharriso

3

Sử dụng các kiểu đánh máy để truy cập các chức năng nút từ TypeScript:

typings install env~node --global

Nếu bạn không có cách đánh máy, hãy cài đặt nó:

npm install typings --global

20
Cần lưu ý rằng typings được phản đối ủng hộ đơn giảnnpm install @types/node --save-dev
— Mike Chamberlain
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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.