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:提供關於此模組的自訂型別定義。(可選擇零努力方式)
- 在專案根目錄下建立一個名為「typings-custom」的資料夾
- 在你的 tsconfig.json 中引用此資料夾的內容:
"include": [
"./typings-custom/**/*.ts"
]
- 建立一個名為這個精確名稱的檔案: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';
