【问题标题】:TypeScript interface with multiple call signatures具有多个调用签名的 TypeScript 接口
【发布时间】:2017-09-13 10:15:19
【问题描述】:

我在 TypeScript 2.2 中看到了通过定义的接口调用签名“重载”函数的选项,我花了很长时间来了解如何使用它。

所以在处理它并“破解”它之后,我认为值得在这里发布它。

我开始的问题是,例如:

interface Func1 {
    (num1: number, num2: number): number;
    (str1: number, str2: string): string;
}

function F1(num1: number, num2: number): number {
    return num1 + num2;
}

const f1: Func1 = F1;
console.log(f1(1, 2));

但是编译器没有通过它,因为Func1 不能接受F1 函数。

我想做重载,不知道怎么办。

请参阅下面的答案。

【问题讨论】:

    标签: function typescript interface overloading


    【解决方案1】:

    在挖掘它之后,我发现我们可以做相当多的重载。 TypeScript 中的重载与任何其他 JavaScript 代码没有什么不同。它必须在 一个 函数中实现,而不是在多个函数中实现,例如在 C++ 中。你需要让你的函数接受所有选项。

    例如:

    interface Func1 {
        (v1: number, v2: number): number;
        (v1: string, v2: string): string;
    }
    
    const f1: Func1 = (v1, v2): any => {
        return v1 + v2;
    };
    console.log(f1("1", "2"));
    console.log(f1(1, 2));
    

    函数f1 假设重载接口调用签名的所有选项都有类型,如果设置强类型它将阻止你,因为类型不可转换。就像在这个例子中number 不能转换为string

    您还可以创建多个使用接口调用签名重载的函数,并将它们传递给您的f1,如果类型匹配,它将通过。只需确保您的函数可以处理所有接口调用签名。

    在使用类或函数参数不简单时检查实现函数的类型很重要,如上例,使用typeof 并控制所有选项。

    希望对您有所帮助。

    【讨论】:

    • typeof 仅对“简单”类型有意义。如果您这样做,请不要instanceof 检查您正在编写一个糟糕的 API。我可以并且会使用不是 instanceof 你的类的东西来调用你的 API,你将无法阻止它。
    • 如果我想用不同的泛型参数进行重载怎么办?例如interface GenericIdentityFn { <T>(arg: T): T; <T, F>(arg1: T, arg2: F): [T, F]; }
    • @FindOutIslamNow 多个同名接口默认合并,它们的泛型也是如此(也按名称)。 interface I<A>, interface I<A,B>, interface I<C> == interface I<A,B,C>.
    • "运算符 '+' 不能应用于类型 'string | number' 和 'string | number'。"
    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 2021-04-12
    • 2018-09-14
    • 2018-04-01
    • 2020-02-02
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多