我正在拍打打字稿。它在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"
,如某些答案所示,仍然无法正常工作我们如何在打字稿中使用npm包?
[编辑]非常感谢您的回答!但是,截至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
。在没有可用的打字的情况下。您有两种选择:在.d.ts
文件上编写自己的选项,或忽略库的类型检查。
要完全忽略类型检查(这不是推荐的方法),请在any
类型的变量上导入库。
const _: any = require('lodash');
console.log(_.toUpper('Hello, world !'))
tsc
会抱怨require
不存在。提供node
打字,或declare
它以丢弃错误。
[2018/12]我在2016年提出的这个问题的新的,最新的回答,尽管有过时的答案,仍然显示了很多活动。
简而言之,TypeScript需要有关包的代码的类型信息(a.k.a。“type declaration files”a.k.a。“typings”)并且正确地告诉您,否则您将失去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)
你可能错过了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';
它对我有用。
declare module "module-name";
"typesRoots": [
"./typings",
"../node_modules/@types"
]