是否有可能在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; 
    } 
} 

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

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 

这样做的返回值检查部分是一个有点古怪,因为技术上的打字稿希望你返回number & string这是不是实际发生的事情,所以使用any作为返回类型是最简单的方法去。

+0

感谢您的详细解释:) – eAbi

+0

这对于具有不同参数数量的过载是不正确的。也真正的重载返回正确的类型取决于哪个签名匹配,而不是任何哪种丢失所有类型的安全 –

+0

我站在更正,虽然你的例子没有显示它,这对于不同数量的参数完全适用,并且任何isn在使用物体时不显示。我的假设很糟糕,我读得太快,并认为你只是提出了原始联盟类型。 –

如果您需要在不依赖接口的情况下执行此操作,则可以通过在对象字面量的范围内重载函数并将其设置在文字上来实现此目的。

例如:

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(滚动至底部)