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.jsontypings.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 installtypings/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 包定义自定义类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Electron 重建原生 npm 模块?

如何为 ts-loader 指定 typescript 版本?

如何为所有节点模块自动安装@types

TypeScript学习

如何为 TypeScript 定义文件导入文件

如何为 TypeScript 配置 Sublime 构建系统