是否可以在typescript中重载对象函数属性?

时间:2016-01-14 20:21:44

标签: typescript

我想知道是否有一种简单的方法可以在typescript中重载对象的函数属性。例如:

interface Doable {
    do(s: number): number;
    do(s: string): string;
}

let obj: Doable = {
    do(s: number): number;
    do(s: string): string;
    do(s: number | string) {
        return s;
    }
}

这里的编译器会引发一个错误,抱怨do属性是重复的。是否有另一种在不使用any的情况下声明函数的方法?

我已经知道这个实现会起作用。

let obj: Doable = {
    do(s: any) {
        return s;
    }
}

3 个答案:

答案 0 :(得分:3)

您不需要在对象文字中声明重载签名。只需写下:

interface Doable {
    do(s: number): number;
    do(s: string): string;
}

let obj: Doable = {
    do(s: number | string): any {
        return 42;
        return '';
    }
}

obj(42); obj(''); // OK

返回值检查部分有点奇怪,因为技术上TypeScript要求您返回number & string这不是实际发生的事情,因此使用any作为返回类型是最简单的要走的路。

答案 1 :(得分:3)

如果您需要在不依赖接口的情况下执行此操作,可以通过重载对象文字范围内的函数然后在文字上设置它来完成此操作。

示例:

function myFunc(a : number) : number;
function myFunc(b : string, c : string) : boolean;
function myFunc(a : number | string, c? : string) : any{
  //function impl goes here
}

const myLiteral = {
   myFunc
};

这样您就不必使用任何参数,并且可以使用具有不同参数数量的函数。 (在我的示例中返回任何函数定义的函数定义不用作有效函数签名之一;只有impl之前的前两个定义。)

https://www.typescriptlang.org/docs/handbook/functions.html(滚动到底部)

得到了这个想法

答案 2 :(得分:1)

@Ryan Cavanaugh的answer允许呼叫者具有强类型,但缺点是any函数的do返回类型弱主体(被调用方一侧)。

@Sterling Camden最好使用function overloads,因为它可以为do函数实现提供强返回类型(与所讨论的方法重载相反)。但是他的样本仍然使用any,因此 callee 不能依赖类型检查。

相反,我们可以使用两全其美的方法:

interface Doable {
    do(s: number): number;
    do(s: string): string;
}

function doFn(s: number): number
function doFn(s: string): string
function doFn(s: string | number): string | number {
    return Math.random() > 0.5 ? "foo" : 42
    // strong types for the function body
    // return true // error, not assignable to string | number
}

let obj: Doable = {
    do: doFn
}

// strong types for the caller
obj.do(42) // number
obj.do("foo") // string
obj.do(true) // error

Playground sample