Implementation 如何在TypeScript接口中实现重载方法?
我是typescript新手,这里有一个我想要实现的接口Implementation 如何在TypeScript接口中实现重载方法?,implementation,typescript,Implementation,Typescript,我是typescript新手,这里有一个我想要实现的接口 interface IThing{ name:string; age:number; sayHello:{ (name:string):string; (age:number):number; } } sayHello有两个表示过载版本的签名。我只是不知道如何在课堂上实现,有什么帮助吗?谢谢。要实现重载函数,请先编写希望可见的所有重载调用签名,然后编写一个实现签名,该签名是
interface IThing{
name:string;
age:number;
sayHello:{
(name:string):string;
(age:number):number;
}
}
sayHello有两个表示过载版本的签名。我只是不知道如何在课堂上实现,有什么帮助吗?谢谢。要实现重载函数,请先编写希望可见的所有重载调用签名,然后编写一个实现签名,该签名是所有重载签名的超集。例如:
class Thing implements IThing {
// Implement the name and age fields
name: string;
age: number;
// Overload signature #1
sayHello(name: string): string;
// Overload signature #2
sayHello(age: number): number;
// Implementation signature, not visible to external callers
sayHello(arg: any): any {
if(typeof arg === 'string') {
return this.name;
} else if(typeof arg === 'number') {
return this.age;
} else {
throw new Error('sayHello can only take string or a number');
}
}
}
var x = new Thing();
var n = x.sayHello('world'); // n: string
var a = x.sayHello(42); // a: number
var e = x.sayHello(false); // error: false is not string or number
在我看来,这不像是有效的打字脚本。您看过这里的代码示例了吗?通过IntelSense没有错误发生,我从这里的typescript介绍视频中得到了这段代码片段:这是完全有效的typescript,这是一个有效、简单的问题。投票重新打开。您在界面中定义的是一个带有两个不同构造函数的
sayHello
对象。这就是为什么它是有效的TypeScript-它不是您正在寻找的TypeScript。重载语法见@RyanCavanaugh的答案。+1。我想补充一点,当向接口添加重载方法时,您不需要实现签名,您只需要对类使用它,如下面的答案所示。这很好。谢谢,这是实现此功能的唯一方法吗?我发现这个重写机制似乎只是用来限制输入args/返回值的类型?如果没有,我可以在接口中将函数签名声明为sayHello(arg:any):any,然后在实现类中填充代码片段sayHello(arg:any):any{//if…else…}。有什么能帮我澄清我的困惑吗?@Steve Fenton,对不起,我不太明白你说的话,只在类中需要它吗?@paulcheung是的-实现签名(接受上述类型any
的参数的签名)只在类中需要。另外两个(接受上述string
和number
类型的参数)是您需要添加到接口上的唯一参数。@SteveFenton您太好了!