如何从 typescript 使用 npm 模块?

新手上路,请多包涵

我正在试一试打字稿。它在 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 问题要么没有答案( 此处此处),要么无关。

元素:

  • 打字稿 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 包?

原文由 Offirmo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 432
2 个回答

[201812] 我在 2016 年提出的这个问题的最新答案,尽管答案已经过时,但仍然显示出很多活动。

长话短说,TypeScript 需要关于你的包代码的 类型信息(又名“ 类型声明文件”又名“类型”),并且正确地告诉你,否则你会失去 TypeScript 的全部意义。有几种解决方案可以提供或选择退出,此处按最佳实践顺序列出:


解决方案 0 :模块已经提供了类型。如果它的 package.json 包含这样的一行:

 "typings": "dist/index.d.ts",

它已经支持 TypeScript。如果您正在阅读此页面,则很可能不是这种情况,所以让我们继续…


解决方案 1 :使用来自社区贡献的类型 肯定 类型。对于模块“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 模块)。

您也可以尝试自己编写类型信息,查看 官方文档 和/或来自 DeveloplyTyped 的示例。如果您这样做,请考虑将您的类型直接贡献到模块中(解决方案 0,如果模块作者接受)或绝对类型(解决方案 1)

原文由 Offirmo 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

原文由 Blackus 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题