TypeScript:如何为已安装的 npm 包定义自定义类型?
Posted
技术标签:
【中文标题】TypeScript:如何为已安装的 npm 包定义自定义类型?【英文标题】:TypeScript: How to define custom typings for installed npm package? 【发布时间】:2016-10-05 03:33:24 【问题描述】:我喜欢在 TypeScript 中使用 rx-node
import RxNode from 'rx-node';
我使用 npm 安装了rx-node
$ npm install rx-node --save
我搜索了类型定义,但没有任何结果
$ typings search rx-node
No results found for search
如何为已安装的 npm 模块 rx-node 定义自定义类型定义?我应该在哪里存储类型定义文件?如何配置 TypeScript(tsconfig.json 和 typings.json)?
编辑:感谢Aleksey L. 和David Bohunek,我实现了定义一个看起来像这样的rx-node.d.ts
declare module "rx-node"
import Observable from '@reactivex/rxjs';
import ReadLine from "readline";
function fromReadLineStream(stream: ReadLine): Observable<string>
我安装了@reactivex/rxjs
npm install --save @reactivex/rxjs
因为我遇到了错误
node_modules\@reactivex\rxjs\dist\cjs\Observable.d.ts (10,66): Cannot find name 'Promise'. (2304)
我将 tsconfig.json 中的目标更改为 es6
。
【问题讨论】:
【参考方案1】:请注意,这是关于使用 typings 管理定义的老问题 (2016),不推荐使用它,而是直接通过 npm 安装它们
您可以将自定义定义添加到 typings.json。例如具有以下文件夹结构:
/typings
/custom
rx-node.d.ts
/global
...
其中 rx-node.d.ts 是您的自定义类型文件。例如:
declare module RxNode
export interface ...
然后用命令安装
typings install file:typings/custom/rx-node.d.ts --save --global
或手动:在 typings.json 中添加对该类型文件的引用:
"name": "TestName",
"version": false,
"globalDependencies":
"rx-node": "file:typings/custom/rx-node.d.ts"
然后运行typings install
【讨论】:
运行typings install
将 typings/custom/rx-node.d.ts
复制到 typings/globals/rx-node/index.d.ts
。如果我更改类型定义,我必须再次运行typings install
来复制更改。与在 index.d.ts
中手动引用 rx-node.d.ts
相比,这种方法有什么优势?
我个人更喜欢不编辑自动生成的文件(并在源代码管理中添加忽略规则)。同样,一旦定义了类型,它们就不会改变,直到原始库被更改。一旦“官方”版本可用,就可以轻松替换。
我认为这种方法从 TypeScript 2.x 开始已经改变,因为 typings
文件夹是多余的,所有类型都是通过 npm 在 node_modules/@types/... 中安装的?对于缺少定义的自定义类型,是否有推荐的方法?
@Squiggle,是的,不是的。您仍然可以将 typings 与 TS 2 一起使用。如果您选择移动到 @types - 自定义本地类型可以包含在 "typeRoots"
编译器选项中(以防万一喜欢将它们与其他来源分开存储)【参考方案2】:
创建一个名为 rx-node.d.ts
的新文件,并确保在您的 tsconfig.json
中直接或从另一个文件(例如 typings/index.d.ts
)引用它。
然后你可以从这样的事情开始:
///<reference path="rx.d.ts" />
declare namespace RxNode
export interface Emitter<T>
export function toEventEmitter<T>(observable: Rx.Observable<T>, eventName: string): Emitter<T>;
这个问题/答案可能会有所帮助:How to write d.ts file from existing .js file?
如果你创建了一个不错的、高质量的类型定义文件,请贡献给https://github.com/DefinitelyTyped/DefinitelyTyped
【讨论】:
太好了,已经有pull request:D【参考方案3】:对于使用 create-react-app (react-scripts) 的 ReactJS 项目,您可以在 src/react-app-env.d.ts
中为您的无类型包添加模块声明。
declare module "not-typed";
注意:以后此文件的位置可能会改变,请参阅this issue。
【讨论】:
以上是关于TypeScript:如何为已安装的 npm 包定义自定义类型?的主要内容,如果未能解决你的问题,请参考以下文章