Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Implementation 如何在TypeScript接口中实现重载方法?_Implementation_Typescript - Fatal编程技术网

Implementation 如何在TypeScript接口中实现重载方法?

Implementation 如何在TypeScript接口中实现重载方法?,implementation,typescript,Implementation,Typescript,我是typescript新手,这里有一个我想要实现的接口 interface IThing{ name:string; age:number; sayHello:{ (name:string):string; (age:number):number; } } sayHello有两个表示过载版本的签名。我只是不知道如何在课堂上实现,有什么帮助吗?谢谢。要实现重载函数,请先编写希望可见的所有重载调用签名,然后编写一个实现签名,该签名是

我是typescript新手,这里有一个我想要实现的接口

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您太好了!