【问题标题】:TypeScript typings for package that extends built-in node types扩展内置节点类型的包的 TypeScript 类型
【发布时间】:2021-06-20 18:38:01
【问题描述】:

我正在尝试为 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 它在 ReadStream 上调用 keypress() 以添加功能。例如,除非调用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;
        };
      }
    }
  }
}

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

【问题讨论】:

    标签: typescript definitelytyped


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-06
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 2018-05-08
      • 2020-09-12
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多