Làm thế nào để tìm mô-đun “fs” trong Mã MS với TypeScript?


83

Tôi đang chạy trên MacBook Air. Tôi đã cài đặt Mã MS làm IDE và cũng đã cài đặt TypeScript.

Tôi có một tệp đơn giản chỉ với dòng này:

import fs = require('fs');

Tôi nhận được một chữ nguệch ngoạc màu đỏ dưới 'fs' bên trong dấu ngoặc đơn và thông báo lỗi là [ts] Cannot find module 'fs'.Tệp có phần mở rộng .ts. Tôi mới làm quen với JavaScript và TypeScript, nhưng tôi có ấn tượng rằng đó fslà một mô-đun cốt lõi, vì vậy làm thế nào để không tìm thấy nó? Làm cách nào để khắc phục sự cố?

Những thứ khác mà tôi đã thử:

  • Đưa một nội dung chức năng đơn giản vào tệp và sau đó biên dịch trên dòng lệnh với tsc. Tôi nhận được một lỗi tương đương về cơ bản ở đó:error TS2307: Cannot find module 'fs'.
  • Trên dòng lệnh sudo npm install fs -g. Điều này báo cáo thành công rõ ràng, nhưng không khắc phục được sự cố.

Tôi đã xem xét SE và web, nhưng tất cả các câu trả lời có vẻ gần giống như giả định rằng 'fs' có sẵn.


Bạn chắc chắn đang thực thi mã này với node?
peteb

Kế hoạch là thực hiện nó với nút, vâng. Quyền truy cập tệp cục bộ là ok cho ứng dụng hiện tại. @peteb
Brick,

Câu trả lời:


95

Bạn cần bao gồm tệp định nghĩa cho nút.

TypeScript 2.0+

Cài đặt bằng npm:

npm install --save-dev @types/node

TypeScript <2.0

Nếu bạn sử dụng typings sau đó bạn có thể chạy lệnh này:

typings install dt~node --global --save

Hoặc nếu bạn đang sử dụng cách đánh máy <1,0 chạy:

typings install node --ambient --save

Hoặc nếu vẫn không thành công, hãy tải xuống thủ công tệp tại đây và đưa nó vào dự án của bạn.


1
Tôi đã sử dụng lệnh mà bạn có trước khi chỉnh sửa và điều đó đã thực hiện được một mẹo nhỏ. ( typings install node --ambient --save) Cảm ơn!
Brick

@Brick có điều đó sẽ hoạt động. Lệnh trong câu trả lời dành cho kiểu đánh máy 1.0 vừa được phát hành
David Sherret

Điều này đã lỗi thời, những loại ngày này thường nên được cài đặt với npm, như trong câu trả lời của Abe bên dưới .
dshepherd

Với sợi:yarn add @types/node --dev
Jonathan H

Sau khi cài đặt @types/node, bạn có thể cần phải khởi động lại Mã để mã nhận dạng đúng các mô-đun. Điều này chỉ nên xảy ra với các mô-đun nút gốc và thậm chí có thể không phải là vấn đề đối với bạn tùy thuộc vào việc xây dựng Mã của bạn.
Don

50

Có một cách tốt hơn bây giờ mà không cần đến các công cụ tsd hoặc typings trước đây. NPM hiện có gói @types dành cho kiểu chữ. Trong ví dụ này, bạn cần gói @types/node:

npm install "@types/node" --save-dev

Đảm bảo rằng bạn đang sử dụng tùy chọn save-dev để chỉ cài đặt các loại trong chế độ phát triển, không phải trong sản xuất. Bạn nên có thư viện nút mới nhất khi sử dụng cú pháp npm install "@ type /" ...

Nó không tìm thấy gói fs vì các công cụ trước đó đánh máy rất có thể không sử dụng tệp định nghĩa node.d.ts mới nhất.

Tập tin tsconfig.json của bạn cần được cập nhật để tìm các gói loại này. Ví dụ của tôi nếu sử dụng jquery, jqueryui và các loại nút. Giả sử bạn cũng cần cú pháp để làm việc cho trình chỉnh sửa mã của mình, trong trường hợp này là trình chỉnh sửa mã 'nguyên tử'

{
"compileOnSave": false,
"compilerOptions": {
    "rootDir": "src",
    "sourceMap": true,
    "target": "es5",
    "module": "amd",
    "declaration": false,
    "noImplicitAny": false,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "moduleResolution": "node",
    "lib": ["es2015", "dom"],
    "baseUrl": "./",
    "typeRoots": [
        "node_modules/@types"
    ],
    "types": [
        "jquery",
        "jqueryui",
        "node"
    ],
    "paths": {
        "src/*": ["src/*"]
    }
},
"exclude": [
    "node_modules",
    "dist",
    "build"
],
"filesGlob": [
    "./src/**/*.ts",
    "./test/**/*.ts",
    "./typings/index.d.ts",
    "./custom_typings/**/*.d.ts",
    "./node_modules/@types/**/*.d.ts"
],
"atom": {
    "rewriteTsconfig": false
}
}

32

"fs" là một mô-đun Node cốt lõi và tôi nghĩ rằng cú pháp câu lệnh nhập của bạn hơi sai. Thử:

import * as fs from "fs";

Ah không bao gồm các cách đánh máy cho Node. Hãy thử thêm tệp này và một đường dẫn tham chiếu đến nó: github.com/DefinifinityTyped/DefinifinityTyped/blob/master/node/…
Eric N

1
@EricN Trang dẫn đến 404. Cần đánh máy ngay cả khi mô-đun là một phần của toàn bộ lõi NodeJs?
Jacks

Vâng, việc đánh máy là cần thiết. Node không được viết bằng Typecript nên nó không có bất kỳ dữ liệu kiểu nào mà Typecript tìm kiếm. Tệp định nghĩa cung cấp tất cả dữ liệu kiểu đó cho bạn.
Eric N

21

Tất cả những gì bạn cần là "moduleResolution" được đặt thành "nút" trong tsconfig.json của bạn:

{
  "compilerOptions": {
      ...
      "moduleResolution": "node"
      ...
  }
}

hành hình

npm install @types/node --save-dev

và bây giờ bạn có thể sử dụng nhập TypeScript tiêu chuẩn:

import * as fs from "fs";

Cố gắng nhưng vẫn nhận được cùng một vấn đề
Pardeep Jain

1
@pardeepjain, có khả năng bạn có bảng chữ cũ không? Sử dụng vscode? Kiểm tra phiên bản Typecript trên thanh trạng thái.
yrtimiD

4

Bạn có ba tùy chọn trong tsconfig.json(tại đây: Node 11+), xem tài liệu :

Chỉ xác định cả hai typeRootstypes, chỉ typeRootshoặc loại bỏ hoàn toàn cả hai dòng (khuyến nghị):

{"compilerOptions": {
  ...
  "typeRoots": ["node_modules/@types"],  // "typeRoots": [] -> won't work
  "types": ["node"]                      // "types": [] -> won't work
}}

Các loại cài đặt:

npm install --save-dev @types/node

Sử dụng hệ thống tệp dựa trên lời hứa (ví dụ: sử dụng async / await):

import {promises as fs} from 'fs';

async function foo() {
    ...
    await fs.writeFile('./yourPath', 'YourContent');
}

Khi tôi tạo một thư mục khai báo để đặt .d.tscác tệp của mình và tạo một typeRootsmảng trong tôi, compilerOptionstôi đã không chỉ định node_modules/@typesvà đó là nguyên nhân gây ra lỗi cho tôi. Sau khi tôi thêm nó vào typeRootsmảng, nó hoạt động trở lại.
str8up7od

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.