如何从打字稿中使用 npm 模块?

How to consume npm modules from typescript?

我正在尝试打字稿。它在 hello world 阶段运行良好。我现在正在尝试使用 npm 模块:

index.ts =

import _ = require('lodash')

console.log(_.toUpper('Hello, world !'))

这行不通:

查看 typescript 文档和 google 没有帮助。其他 S/O 个问题要么没有答案(here and )要么不相关。

元素:

我们如何在打字稿中使用 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 以放弃错误。

您可能错过了 Declaration Files

有关详细信息,请参阅 DefinitelyTyped


试试这个:

npm install --save lodash
npm install --save @types/lodash

现在可以导入了。

import _ from 'lodash';

如果您导入的模块有多个导出,您可以这样做:

import { Express, Router } from 'express';

如果您要导入的模块 "has no default export" 您需要这样做:

import * as http from 'http';

[2018/12] 我在 2016 年提出的这个问题的新的、最新的答案,尽管答案已经过时,但剧照显示了很多 activity。

长话短说,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 模块)。

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

对我有用。

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

    declare module "module-name";

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

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

我遇到了这个错误,none 的答案对我有用 但是当你想在 typescript 安装中使用节点模块时我发现了一些东西他们作为

$npm install @types/<module_name>

例如

npm install @types/cheerio

而不是说

npm install cheerio