【问题标题】:Typescript: Expand existing function definition打字稿:扩展现有函数定义
【发布时间】:2020-05-14 19:29:58
【问题描述】:

是否可以基于现有的函数定义创建新的函数定义?

比如我有一个第三方库,有以下两个功能:

declare function v1(s: string, t: string): string;
declare function v2(n: number): string;

我有一个用 JS 编写的函数,但最近被要求添加 Typescript 定义。我的函数如下所示:

function useId(version, ...args) {
    return generators[version](...args);
}

我想做的是采用现有的 v1 和 v2 声明,并像这样在我自己的地方使用它们:

declare function useId(v: "v1", ...v1): string;
declare function useId(v: "v2", ...v2): string;

我无法找到任何满足此特定需求的高级类型,但想在采取更长更详细的路线来添加我的函数定义之前进行检查(假设它们将与前面的一个新参数重复)。

【问题讨论】:

  • 这看起来很有希望,我会研究一下。谢谢!

标签: typescript


【解决方案1】:

如题“Is there ArgumentsType<T> like ReturnType<T> in Typescript?”,可以使用Parameters&lt;T&gt; and ReturnType&lt;T&gt;来引用已知函数T的参数和返回类型。如果您使用该类型键入 ...args 参数,它将在您的签名中包含这些参数。

declare function useId(v: "v1", ...args: Parameters<typeof v1>):
    ReturnType<typeof v1>;
declare function useId(v: "v2", ...args: Parameters<typeof v2>):
    ReturnType<typeof v2>;

useId("v1", "s", "t");
useId("v2", 9001);

如果您重复执行此操作,则可以使用可调用接口类型来表示重载。 (否则可能很难将重载指定为联合,如问题Overloaded function type in typescript 中所示。)如果您需要经常这样做,我想您甚至可以使用映射类型或其他聪明的方法来表示包装器之间的关系以及您的原始功能。

interface WrapperInterface<
    V1 extends (...args: any) => any,
    V2 extends (...args: any) => any> {
  (version: "v1", ...args: Parameters<V1>): ReturnType<V1>;
  (version: "v2", ...args: Parameters<V2>): ReturnType<V2>;
}

declare const useId2: WrapperInterface<typeof v1, typeof v2>;

useId2("v1", "s", "t");
useId2("v2", 9001);

typescript playground

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 2021-02-20
    • 1970-01-01
    • 2019-09-18
    • 2016-12-12
    • 2018-02-11
    • 2019-09-26
    • 1970-01-01
    • 2019-05-04
    相关资源
    最近更新 更多