首页 > 解决方案 > 扩展内置节点类型的包的 TypeScript 类型

问题描述

我正在尝试为https://www.npmjs.com/package/keypress创建完整类型

我已经正确输入了基本函数(我认为),但无法弄清楚如何扩展process.stdin该包的声明以使 IntelliSense 满意。

具体来说,keypress添加一个process.stdin.on('keypress', listener)事件。listener有签名之类的(ch: Ch, key?: Key) => void

我不确定是否需要扩展Process接口或ReadStream接口,因为理论上如果我理解正确,它可以在任何ReadStream.

我也不确定是否可以通知 TypeScript 它正在调用添加功能keypress()的 a ReadStream。例如,阻止访问除非keypress()被调用。我怀疑这是可能的,但询问是否可能。

这是我目前的尝试:

declare module "keypress" {
  export default function keypress(stream: NodeJS.ReadStream): void;

  export type Ch = any; // TODO
  export type Key = {
    // TODO
    ctrl: any;
    name: string;
  };

  namespace global {
    namespace NodeJS {
      interface Process {
        stdin: NodeJS.ReadStream & {
          fd: 0; // From official node types
          on(event: "keypress", listener: (ch: Ch, key?: Key) => void): this;
        };
      }
    }
  }
}

我已经尝试了一些变化,但我宁愿不要盲目射击。对此的任何指示都非常感谢。干杯!

标签: typescriptdefinitelytyped

解决方案


查看官方节点类型定义,这是您要扩展的内容:https ://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/node/process.d.ts#L217

您的方法对我来说看起来不错,但是我认为目前无法做到这一点。您可以使用声明合并来扩展类型,但不能使用它来覆盖类型的现有成员。否则,多个类型定义可能会相互冲突。

但是这里有关于实施解决方案的讨论:https ://github.com/microsoft/TypeScript/issues/36146


推荐阅读