【问题标题】:Typings for a function allowing both a promise and a callback允许承诺和回调的函数的类型
【发布时间】:2020-02-16 03:09:42
【问题描述】:

我正在使用universalify 生成一个函数,该函数默认返回一个承诺,但也支持回调作为最后一个参数(这样就不会返回一个承诺)。我将如何编写正确的 Typescript 类型来在我的 index.d.ts 文件中描述这一点?

目前,我不得不以函数重载的形式复制我的函数类型以支持承诺:

declare function someFunc(opts): Promise<any>
declare function someFunc(opts: object, callback: (error: Error | null, result: any | void) => any): void

当我在大型项目中使用此术语时,当我不得不通过输入两次或三次来重命名时,它会增加很大的开发负担。

实现这一目标的传统方法是什么?

【问题讨论】:

  • 你的 IDE 不能帮你重命名吗?
  • @Bergi 确实如此,但这只是逃避问题。
  • 我认为没有问题。如果你想提供一个带有回调的重载,很自然地必须重复函数名。

标签: javascript typescript


【解决方案1】:

你说的是overloads,我认为他们这样做的传统方式。

从 TS3.0 左右开始,您可以使用 rest tuplesgenericsconditional types 来避免过载,如下所示:

type Callback<T> = (error: Error | null, result: T | void) => any;
declare function someFunc2<C extends [Callback<any>] | []>(
    opts: object,
    ...[callback]: C
): C extends [Callback<any>] ? void : Promise<any>;

const promiseResult2 = someFunc2({});
const voidResult2 = someFunc2({}, (e, r) => r);

但治疗可能比这里的疾病更糟糕。我认为,除非您的用例确实需要单个调用签名,否则我会坚持使用重载。希望有帮助;祝你好运!

Link to code

【讨论】:

    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 2018-10-04
    • 2017-09-16
    • 1970-01-01
    • 2019-01-15
    • 2016-10-24
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多