javascript - TypeScript ile VS Code'da "fs" modülü nasıl bulunur?


Bir MacBook Air üzerinde çalışıyorum. IDE olarak VS Code'u yükledim ve ayrıca TypeScript de yükledim.

Sadece bu satırı içeren basit bir dosyam var:

import fs = require('fs');

Parantez içindeki 'fs' üzerinde kırmızı dalgalı bir çizgi görünüyor ve hata mesajı [ts] Cannot find module 'fs'.. Dosyanın uzantısı .ts. JavaScript ve TypeScript konusunda yeniyim ama fs'nin temel bir modül olduğunu düşünüyordum, o zaman nasıl bulunamaz? Bu sorunu nasıl çözebilirim?

Zaten denediğim diğer şeyler:

  • Dosyaya basit bir fonksiyon gövdesi koyup ardından komut satırında tsc ile derliyorum. Orada da esasında eşdeğer bir hata alıyorum: error TS2307: Cannot find module 'fs'.
  • Komut satırında sudo npm install fs -g komutunu çalıştırın. Bu görünürde başarı raporlar, ancak sorunu çözmez.

SE ve web'de araştırma yaptım, ama yakın gibi görünen cevapların hepsi 'fs'in mevcut olduğunu varsayıyor gibi görünüyor.

Cevap #1

Node için tanım dosyasını eklemeniz gerekiyor.

TypeScript 2.0+

npm kullanarak yükleyin:

npm install --save-dev @types/node

TypeScript < 2.0

Eğer tip kullanıyorsanız, bu komutu çalıştırabilirsiniz:

typings install dt~node --global --save

Veya eğer typings < 1.0 kullanıyorsanız, çalıştırın:

typings install node --ambient --save

Veya başka her şey başarısız olursa, dosyayı buradan manuel olarak indirip projenize dahil edin.

Cevap #2

Önceki tsd veya typings araçlarına gitmeden şimdi daha iyi bir yol var. NPM artık TypeScript için @types paketine sahip. Bu örnekte @types/node paketine ihtiyacınız var:

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

Türlerini yalnızca geliştirme modunda yüklemek için save-dev seçeneğini kullandığınızdan emin olun, üretimde değil. npm install "@types/" sözdizimini kullanırken en son node kütüphanelerine sahip olmalısınız...

Fs paketini bulamıyor çünkü önceki araçların tip tanımlamaları muhtemelen en son node.d.ts tanım dosyasını kullanmıyor.

Bu tür paketleri bulmak için tsconfig.json dosyanızın güncellenmesi gerekiyor. Benim örneğim jquery, jqueryui ve node tiplerini kullanıyor. Kod editörünüzde de sözdiziminin çalışması gerektiğini varsayarsak, bu durumda 'atom' kod editörü

{
"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
}
}

Cevap #3

"fs" bir temel Node modülüdür ve bence import ifadenizin sözdizimi biraz yanlış. Şunu deneyin:

import * as fs from "fs";

Cevap #4

Tek yapmanız gereken, tsconfig.json dosyanızda "moduleResolution" değerini "node" olarak ayarlamaktır:

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

uygulamak

npm install @types/node --save-dev

ve şimdi standart TypeScript ithalatını kullanabilirsiniz:

import * as fs from "fs";

Cevap #5

tsconfig.json'de üç seçeneğiniz var (burada: Node 11+), belgelere bakın:

Ya her ikisini de belirtin typeRoots ve types, sadece typeRoots veya her iki satırı tamamen kaldırın (önerilir):

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

Kurulum türleri:

npm install --save-dev @types/node

Söz promise tabanlı dosya sistemi kullanın (ör. async/await kullanmak için):

import {promises as fs} from 'fs';

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

İlgili makaleler