【问题标题】:TypeScript: How to define custom typings for installed npm package?TypeScript:如何为已安装的 npm 包定义自定义类型?
【发布时间】: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

【问题讨论】:

    标签: node.js typescript typescript1.8


    【解决方案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

    【讨论】:

    【解决方案3】:

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

    declare module "not-typed";
    

    注意:以后此文件的位置可能会改变,请参阅this issue

    【讨论】:

      猜你喜欢
      • 2018-08-24
      • 2018-07-29
      • 2017-03-06
      • 2017-02-17
      • 2016-10-28
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      相关资源
      最近更新 更多