typescript 运算符重载,typescript typeof返回的类型
如何在TypeScript中编写函数重载?下面这篇文章介绍了TypeScript中函数重载的编写方法,希望对你有所帮助!
大多数函数接受一组固定的参数。
但是有些函数可以接受可变数量的参数,不同类型的参数,甚至根据您调用函数的方式返回不同的类型。为了注释这样的函数,TypeScript提供了函数重载。
1. 函数签名
让我们首先考虑一个向特定人返回问候信息的函数。
函数greet(person: string): string {
回复“你好,${person}!`;
}上述函数接受1个字符类型参数:人名。调用这个函数非常简单:
greet(世界);//你好,世界!如果想让greet()函数更灵活呢?例如,要求它接受另一个要问候的人的列表。
这样的函数将接受一个字符串或字符串数组作为参数,并返回一个字符串或字符串数组。
如何注释这样的函数?有两种方法。
第一种方法很简单,就是通过更新参数和返回类型直接修改函数签名。重构后的greet()如下所示:
函数greet(person:string string[]):string string[]{
if (typeof person===string) {
回复“你好,${person}!`;
} else if(array . isarray(person)){
return person.map(name=`Hello,${name}!`);
}
抛出新错误(“无法问候”);
}现在我们可以用两种方式调用greet():
greet(世界);//你好,世界!
打招呼([小智,大爷]);//[你好,小智!、‘你好,大爷!’]直接更新函数签名以支持多种调用方式是一种常见的好方法。
但是,在某些情况下,我们可能需要采用另一种方法来定义可以单独调用您的函数的所有方式。这个方法叫函数重载。
2.函数重载
第二种方法是使用函数重载函数。当函数签名相对复杂,涉及类型较多时,我推荐这种方法。
定义函数重载需要定义重载签名和实现签名。
重载签名定义了函数的参数和返回类型,没有函数体。一个函数可以有多个重载签名:对应于调用函数的不同方式。
另一方面,实现签名也有参数类型和返回类型,也有实现函数的体,并且只能有一个实现签名。
//重载签名
函数greet(人:字符串):字符串;
函数greet(persons:string[]):string[];
//实现签名
功能问候(人:未知):未知{
if (typeof person===string) {
回复“你好,${person}!`;
} else if(array . isarray(person)){
return person.map(name=`Hello,${name}!`);
}
抛出新错误(“无法问候”);
}greet()函数有两个重载签名和一个实现签名。
每个重载签名描述了一种调用函数的方式。就greet()函数而言,我们可以用两种方式调用它:用一个字符串参数,或者用一个字符串数组参数。
签名函数greet(人:未知):未知{.}包含该函数如何工作的适当逻辑。
现在,如上所述,greet()可以用string或string array类型的参数调用。
greet(世界);//你好,世界!
打招呼([小智,大爷]);//[你好,小智!、‘你好,大爷!’]2.1 重载签名是可调用的
虽然实现签名实现了函数行为,但是不能直接调用。只有重载签名是可调用的。
greet(世界);//可以调用重载签名
打招呼([小智,大爷]);//可以调用重载签名
const some value:Unknown= Unknown ;
问候(some value);//实现签名不可调用
//报告错误
没有与此调用匹配的重载。
2的重载1,“(person: string): string”,给出了以下错误。
“unknown”类型的参数不能赋给“string”类型的参数。
2的重载2,“(persons: string[]): string[]”给出了以下错误。
“unknown”类型的参数不能赋给“string []”类型的参数。在上面的例子中,即使实现签名接受未知参数,greet()函数也不能用unknown (greet(someValue))类型的参数调用。
2.2 实现签名必须是通用的
//重载签名
函数greet(人:字符串):字符串;
函数greet(persons:string[]):string[];
//此重载签名与其实现签名不兼容。
//实现签名
函数greet(人物:未知):string {
//.
抛出新错误(“无法问候”);
}重载签名函数greet(person:string[]):string[]被标记为与greet(person: unknown): string不兼容。
签名的已实现字符串返回类型不够通用,无法与重载签名的string[]返回类型兼容。
3.方法重载
尽管在前面的示例中,函数重载应用于普通函数。但是我们也可以重载一个方法。
在方法重载间隔中,重载签名和实现签名都是类的一部分。
例如,我们用重载方法greet()实现了一个Greeter类。
班级迎宾员
消息:字符串;
构造函数(消息:字符串){
this.message=message
}
//重载签名
问候语(人:字符串):字符串;
greet(persons:string[]):string[];
//实现签名
问候(人:未知):未知{
if (typeof person===string) {
返回“${this.message},${person}!`;
} else if(array . isarray(person)){
return person . map(name=` $ { this . message },${name}!`);
}
抛出新错误(“无法问候”);
} ClassGreeter包含greet()重载方法:2重载签名描述如何调用该方法,实现签名包含正确的实现。
由于方法重载,我们可以用两种方式调用hi.greet():使用字符串或使用字符串数组作为参数。
const Hi=new Greeter( Hi );
Hi.greet(小智);//嗨,小智!
Hi.greet([王大爷,大爷]);//[你好,王大爷!嗨,大爷!]
4. 何时使用函数重载
函数重载如果使用得当,可以大大增加可能以多种方式调用的函数的可用性。这在autocomplete中特别有用:我们将在autocomplete中列出所有可能的重载记录。
但是,在某些情况下,建议使用函数签名而不是函数重载。
例如,不要对可选参数使用函数重载:
//不推荐的做法
函数my func():string;
函数my func(param 1:string):string;
函数myFunc(param1: string,param 2:string):string;
函数myFunc(.args: string[]): string {
//实现.
}在函数签名中使用可选参数就足够了:
//推荐做法
函数myFunc(param1?字符串,param2:字符串):字符串{
//实现.
}
5.总结
TypeScript中的函数重载让我们可以定义以多种方式调用的函数。
使用函数重载需要定义重载签名:一组有参数和返回类型的函数,但没有主体。这些签名指示应该如何调用函数。
此外,您必须写出函数的正确实现(实现签名):参数和返回类型,以及函数体。请注意,实现签名是不可调用的。。
除了常规函数,类中的方法也可以重载。
有关编程的更多信息,请访问:编程入门!TypeScript中的函数重载就是这么写的。详细介绍请关注其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。