如何从打字稿中使用 npm 模块?
How to consume npm modules from typescript?
我正在尝试打字稿。它在 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)
查看 typescript 文档和 google 没有帮助。其他 S/O 个问题要么没有答案(here and )要么不相关。
元素:
- 打字稿 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 包??
[编辑] 非常感谢您的回答!但是,截至 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:提供有关此模块的自定义类型。 (可选择零努力)
- 在项目的根目录下创建一个名为 "typings-custom" 的文件夹
- 在您的 tsconfig.json 中引用此文件夹的内容:
"include": [
"./typings-custom/**/*.ts"
]
- 使用以下确切名称创建一个文件:foo.d.ts [foo = 模块的名称] 内容为:
declare module 'foo'
您的 TypeScript 代码现在应该可以编译,尽管没有类型信息(TypeScript 考虑 "any" 类型的 foo 模块)。
您也可以尝试自己编写类型信息,查看官方文档 and/or DefinitelyTyped 中的示例。如果你这样做,请考虑将你的类型直接贡献到模块(解决方案 0,如果模块作者接受)或 DefinitelyTyped(解决方案 1)
对我有用。
- 创建一个名为 "typings" 的文件夹。
在 typings 文件夹中,创建一个文件名 module-name.d.ts。它包含:
declare module "module-name";
在tsconfig.json中引用文件夹
"typeRoots": [
"./typings",
"../node_modules/@types"
]
我遇到了这个错误,none 的答案对我有用 但是当你想在 typescript 安装中使用节点模块时我发现了一些东西他们作为
$npm install @types/<module_name>
例如
npm install @types/cheerio
而不是说
npm install cheerio
我正在尝试打字稿。它在 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)
查看 typescript 文档和 google 没有帮助。其他 S/O 个问题要么没有答案(here and
元素:
- 打字稿 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 包??
[编辑] 非常感谢您的回答!但是,截至 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:提供有关此模块的自定义类型。 (可选择零努力)
- 在项目的根目录下创建一个名为 "typings-custom" 的文件夹
- 在您的 tsconfig.json 中引用此文件夹的内容:
"include": [
"./typings-custom/**/*.ts"
]
- 使用以下确切名称创建一个文件:foo.d.ts [foo = 模块的名称] 内容为:
declare module 'foo'
您的 TypeScript 代码现在应该可以编译,尽管没有类型信息(TypeScript 考虑 "any" 类型的 foo 模块)。
您也可以尝试自己编写类型信息,查看官方文档 and/or DefinitelyTyped 中的示例。如果你这样做,请考虑将你的类型直接贡献到模块(解决方案 0,如果模块作者接受)或 DefinitelyTyped(解决方案 1)
对我有用。
- 创建一个名为 "typings" 的文件夹。
在 typings 文件夹中,创建一个文件名 module-name.d.ts。它包含:
declare module "module-name";
在tsconfig.json中引用文件夹
"typeRoots": [ "./typings", "../node_modules/@types" ]
我遇到了这个错误,none 的答案对我有用 但是当你想在 typescript 安装中使用节点模块时我发现了一些东西他们作为
$npm install @types/<module_name>
例如
npm install @types/cheerio
而不是说
npm install cheerio