如何从typescript中使用npm模块?

时间:2016-07-06 12:38:52

标签: node.js typescript npm tsc

我正在拍打打字稿。它在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问题无法回答(herehere)或无关。

元素:

  • typescript 1.8 latest
  • 是的,lodash已安装npm i --save lodash并存在于我的文件系统中(已检查)
  • 我也做了typings i --save lodash
  • 变体import * as _ from 'lodash'const _ = require('lodash')不起作用
  • 我尝试按照其他答案"moduleResolution": "node""module": "commonjs"中的建议调整tsconfig.json选项,如某些答案所示,仍然无法正常工作

我们如何在打字稿中使用npm包??

5 个答案:

答案 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 :提供有关此模块的自定义类型。 (可以选择零努力)

  1. 在项目的根目录创建一个名为“ typings-custom”的文件夹
  2. 在您的tsconfig.json中引用此文件夹的内容:
"include": [
    "./typings-custom/**/*.ts"
]
  1. 使用以下确切名称创建文件:foo.d.ts [foo =模块名称],内容如下:
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)

对我有用。

  1. 创建一个名为“ typings”的文件夹。
  2. 在“ types”文件夹中,创建一个文件名 module-name.d.ts 。它包含:

    declare module "module-name";

  3. 在tsconfig.json中,引用文件夹

    "typesRoots": [ "./typings", "../node_modules/@types" ]

答案 4 :(得分:0)

我一直收到此错误,但没有答案对我有用,但是当您想在打字稿中使用节点模块时,我发现了一些问题,将它们安装为

$npm install @types/<module_name>

例如

npm install @types/cheerio

而不是说

npm install cheerio