TypeScript:如何为已安装的npm包定义自定义类型?

34

我喜欢在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

3个回答

32

请注意,这是一个关于使用已经停用的 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 中添加对此 typing 文件的引用:

{
    "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,这种方法的优势是什么? - maiermic
1
个人而言,我更喜欢不编辑自动生成的文件(并在源代码控制中添加忽略规则)。此外,一旦类型定义好了,它们就不会再改变,除非原始库被修改。而且一旦有“官方”版本可用,这很容易被替换。 - Aleksey L.
我认为随着TypeScript 2.x的推出,这种方法现在已经改变了,因为typings文件夹是多余的,所有的类型都通过npm安装在node_modules/@types/...中?对于缺少定义的自定义类型,是否有推荐的方法? - Squiggle
1
@Squiggle,可以和不行。您仍然可以在TS 2中使用 typings 。如果您选择转移到 @types - 可以通过“typeRoots”编译器选项包含自定义本地typings(以防您想将它们与其他源分开存储)。 - Aleksey L.

1
创建一个名为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>;
}

这个问题/答案可能会有所帮助:如何从现有的.js文件编写d.ts文件? 如果您创建了一个漂亮的、高质量的类型定义文件,可以为https://github.com/DefinitelyTyped/DefinitelyTyped做出贡献。

1
太好了,已经有一个pull request了 :D - maiermic

0

对于使用create-react-app(react-scripts)的ReactJS项目,您可以在src/react-app-env.d.ts中添加模块声明以针对未经类型化的包。

declare module "not-typed";

注意:将来此文件的位置可能会更改,请参见此问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接