如何从typescript中使用npm模块?

问题描述 投票:57回答:4

我正在拍打打字稿。它在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),要么无关。

元素:

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

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

node.js typescript npm tsc
4个回答
54
投票

[编辑]非常感谢您的回答!但是,截至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它以丢弃错误。


26
投票

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

  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)


15
投票

你可能错过了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';

1
投票

它对我有用。

  1. 创建一个名为“typings”的文件夹。
  2. 在typings文件夹中,创建文件名module-name.d.ts。它包含: declare module "module-name";
  3. 在tsconfig.json中,请参阅该文件夹 "typesRoots": [ "./typings", "../node_modules/@types" ]
© www.soinside.com 2019 - 2024. All rights reserved.