我正在拍打打字稿。它在hello world阶段运行良好。我现在正在尝试使用npm模块:
index.ts
=
import _ = require('lodash')
console.log(_.toUpper('Hello, world !'))
这不起作用:
tsc index.ts
- > Cannot find module 'lodash'. (2307)
node-ts index.js
- > Cannot find module 'lodash'. (2307)
查看打字稿文档并在谷歌没有帮助。其他S / O问题无法回答(here和here)或无关。
元素:
npm i --save lodash
并存在于我的文件系统中(已检查)typings i --save lodash
import * as _ from 'lodash'
或const _ = require('lodash')
不起作用"moduleResolution": "node"
和"module": "commonjs"
中的建议调整tsconfig.json选项,如某些答案所示,仍然无法正常工作我们如何在打字稿中使用npm包??
答案 0 :(得分:52)
[编辑]非常感谢您的回答!但是,截至2018年,它已经过时了。读者,看看其他答案。
有几种方法可以从npm导入模块。但是如果你没有得到打字,tsc
将总是抱怨它找不到你需要的模块(即使被转换的js 实际上正在工作)。
如果您确实有打字并且不使用tsconfig.json
,请使用reference
导入包含:
/// <reference path="path/to/typings/typings.d.ts" />
import * as _ from 'lodash`;
console.log(_.toUpper('Hello, world !'))
如果您使用的是tsconfig.json
文件,请确保包含您的打字文件(或不排除,您的选择),并在前一个示例中设置import
。< / p>
在没有可用的打字的情况下。您有两种选择:在.d.ts
文件上编写自己的文件,或忽略库的类型检查。
要完全忽略类型检查(这不是推荐的方法),请在类型为any
的变量上导入库。
const _: any = require('lodash');
console.log(_.toUpper('Hello, world !'))
tsc
会抱怨require
不存在。提供node
类型,或declare
它以丢弃错误。
答案 1 :(得分:19)
[2018/12]这是我在2016年提出的最新问题的答案,尽管答案过时,但仍然显示出很多活动。
长话短说,TypeScript需要有关软件包代码的类型信息(又称“ type declaration files”又称“类型”),并正确地告诉您,否则,您将失去TypeScript。按照最佳实践的顺序,列出了几种提供或选择退出的解决方案:
解决方案0 :该模块已提供了键入内容。如果其package.json包含这样的行:
"typings": "dist/index.d.ts",
它已经启用了TypeScript。如果您正在阅读此堆栈溢出页面,则很有可能不是这种情况,所以让我们继续...
解决方案1 :使用来自DefinitelyTyped的社区贡献的类型。对于模块“ foo”,请尝试以下操作:
npm add -D @types/foo
如果有效,请中奖!现在,您可以进行输入并可以使用您的模块了。如果npm抱怨找不到模块@ types / foo,让我们继续...
解决方案2 :提供有关此模块的自定义类型。 (可以选择零努力)
"include": [
"./typings-custom/**/*.ts"
]
declare module 'foo'
您的TypeScript代码现在应该编译,尽管没有类型信息(TypeScript考虑类型为“ any”的foo模块)。
您也可以尝试自己编写类型信息,查看official doc和/或DefinitelyTyped中的示例。如果这样做,可以考虑直接将输入内容输入模块(如果模块作者接受,则为解决方案0)或直接输入DefinitelyTyped(解决方案1)
答案 2 :(得分:12)
您可能错过了Declaration Files。
有关详细信息,请参阅DefinitelyTyped。
试试这个:
npm install --save lodash
npm install --save @types/lodash
现在你可以导入。
import _ from 'lodash';
如果您导入的模块具有多个导出,则可以执行以下操作:
import { Express, Router } from 'express';
如果您导入的模块“没有默认导出”,则需要执行此操作:
import * as http from 'http';
答案 3 :(得分:1)
对我有用。
在“ types”文件夹中,创建一个文件名 module-name.d.ts 。它包含:
declare module "module-name";
在tsconfig.json中,引用文件夹
"typesRoots": [
"./typings",
"../node_modules/@types"
]
答案 4 :(得分:0)
我一直收到此错误,但没有答案对我有用,但是当您想在打字稿中使用节点模块时,我发现了一些问题,将它们安装为
$npm install @types/<module_name>
例如
npm install @types/cheerio
而不是说
npm install cheerio