網站搜尋

node.js - 如何在 TypeScript 中使用 npm 模組?


我正在嘗試 TypeScript。在 Hello World 階段運行良好。我現在正在嘗試使用一個 npm 模組:

index.ts =

import _ = require('lodash')

console.log(_.toUpper('Hello, world !'))

這個不起作用 :

  • tsc index.ts -> 找不到模組 'lodash'。 (2307)
  • node-ts index.js -> 找不到模組 'lodash'。 (2307)

查看 TypeScript 文件和 Google 沒有幫助。其他 Stack Overflow 的問題要麼沒有回答(這裡和這裡),要麼不相關。

元素:

  • TypeScript 1.8 最新
  • 是的,lodash 已經安裝了 npm i --save lodash,並且存在於我的檔案系統中(已檢查)
  • 我也執行了 typings i --save lodash
  • 變體 import * as _ from 'lodash' 或 const _=require('lodash') 也不起作用
  • 我嘗試按照其他回答中建議的方式調整 tsconfig.json 選項,"moduleResolution": "node" 和 "module": "commonjs",但仍然無法正常運作

我們如何在 TypeScript 中使用 npm 套件?

答案#1

[2018/12] 對我在2016年提出的這個問題的新、最新回答,儘管裡面的答案已過時,但仍顯示出大量活動。

長話短說,TypeScript 需要關於你套件程式碼的類型資訊(也就是「類型宣告檔」或「typings」),而且它合理地告訴你,否則你將失去使用 TypeScript 的整個意義。提供這些類型資訊或選擇不使用它們的方法有好幾種,以下按照最佳實踐的順序列出:

解決方案 0:該模組已經提供型別定義。如果它的 package.json 包含像這樣的一行:

"typings": "dist/index.d.ts",

它已經啟用了 TypeScript。如果你正在閱讀這個頁面,情況很可能不是這樣,所以讓我們繼續…

解決方案 1:使用來自 DefinitelyTyped 的社群提供型別定義。對於一個模組「foo」,可以這樣嘗試:

npm add -D @types/foo

如果它有效,太好了!你現在有了型別定義,可以使用你的模組。如果 npm 抱怨找不到模組 @types/foo,讓我們繼續...

解決方案 2:提供關於此模組的自訂型別定義。(可選擇零努力方式)

  1. 在專案根目錄下建立一個名為「typings-custom」的資料夾
  2. 在你的 tsconfig.json 中引用此資料夾的內容:
"include": [
    "./typings-custom/**/*.ts"
]
  1. 建立一個名為這個精確名稱的檔案:foo.d.ts [foo=模組的名稱],內容如下:
declare module 'foo'

你的 TypeScript 代碼現在應該可以編譯,儘管沒有任何類型資訊(TypeScript 將 foo 模組視為「any」類型)。

你也可以嘗試自己撰寫類型資訊,參考官方文件和/或 DefinitelyTyped 的範例。如果你這麼做,考慮將你的類型直接提交到模組中(方案 0,如果模組作者接受)或提交到 DefinitelyTyped(方案 1)。

答案#2

[編輯] 非常感謝這個答案!然而,截至2018年,它已經過時了。讀者們,請看看其他答案。

有好幾種方式可以從 npm 匯入模組。但如果你沒有獲得型別定義,tsc 總是會抱怨找不到你所需要的模組(即使轉譯後的 js 實際上 是可以運作的)。

  • 如果你確實有 typings 並且沒有使用 tsconfig.json,請使用 reference 來導入 typings:

    /// <reference path="path/to/typings/typings.d.ts" />
    
    import * as _ from 'lodash`;
    
    console.log(_.toUpper('Hello, world !'))
    
  • 如果你正在使用 tsconfig.json 文件,請確保已包含你的 typings 文件(或者不排除,隨你選擇),並像前面的例子那樣進行 import。

在沒有可用類型定義的情況下,你有兩個選擇:在 .d.ts 文件中自己編寫類型定義,或者忽略該庫的類型檢查。

要完全忽略類型檢查(這不是推薦的方法),請將庫導入到類型為 any 的變數中。

 const _: any = require('lodash');

 console.log(_.toUpper('Hello, world !'))

tsc 會抱怨 require 不存在。提供 node 型別定義,或使用 declare 來忽略這個錯誤。

答案#3

您可能缺少宣告檔案。

更多資訊請參見 DefinitelyTyped。

試試這個:

npm install --save lodash
npm install --save @types/lodash

現在你可以導入。

import _ from 'lodash';

如果你導入的模組有多個輸出,你可以這樣做:

import { Express, Router } from 'express';

如果你正在導入的模組「沒有預設匯出」,你需要這麼做:

import * as http from 'http';