TypeScript中怎么写函数重载?下边本文给大家介绍一下TypeScript中函数重载书写,希望能帮助到大家!
大部分函数公式接纳一组固定不动的参数。
但是有些函数公式能接受可变性总数的参数,不同种类的主要参数,甚至可以根据自己调用函数的形式回到不一样的种类。为了能注解这种函数公式,TypeScript 带来了函数重载作用。
1. 函数签名
我们先来考虑到一个函数,它回到给一个特殊之人的问候信息。
function greet(person: string): string {
return `Hello, ${person}!`;
}
上边的函数公式接纳1个字符类型的参数:人名字。启用该函数公式是很简单的:
greet('World'); // 'Hello, World!'
如果你想要让 greet()
函数公式更加高效,该怎么办?比如,使它此外接纳一个要问好之人的目录。
这种函数公式将进行一个字符串数组或字符串数组做为主要参数,并回到一个字符串数组或字符串数组。
怎样对于这样的函数公式开展注解?有2种方式。
第一种其实很简单,就是利用升级参数和返回类型立即改动函数签名。下边重新构建后greet()
的模样:
function greet(person: string | string[]): string | string[] {
if (typeof person === 'string') {
return `Hello, ${person}!`;
} else if (Array.isArray(person)) {
return person.map(name => `Hello, ${name}!`);
}
throw new Error('Unable to greet');
}
如今我们可以通过两种形式启用 greet()
:
greet('World'); // 'Hello, World!'
greet(['小编', '大冶']); // ['Hello, 小编!', 'Hello, 大冶!']
立即升级函数签名以支持多种启用方法是一种常见的好办法。
但是,在某些情况下,我们也许需要采用另一种方式,各自界定你函数公式能够被调用的全部方法。此方法被称作函数重载。
2.函数重载
第二种方法是什么应用函数重载作用。当函数签名相对复杂且涉及到各种类型时,我建议使用此方法。
界定函数重载必须界定轻载签字和一个完成签字。
轻载签字定义函数的形参和返回类型,并没有函数体。一个函数能够有好几个轻载签字:对应于启用该函数的不一样方法。
另一方面,完成签字还具备参数类型和返回类型,并且还有完成函数公式的核心,且也只能有一个完成签字。
// 轻载签字
function greet(person: string): string;
function greet(persons: string[]): string[];
// 完成签字
function greet(person: unknown): unknown {
if (typeof person === 'string') {
return `Hello, ${person}!`;
} else if (Array.isArray(person)) {
return person.map(name => `Hello, ${name}!`);
}
throw new Error('Unable to greet');
}
greet()
函数公式有两种轻载签字和一个完成签字。
每一个轻载签字都叙述了能够读取该函数公式的一种方式。就 greet()
函数公式来讲,我们可以通过两种形式启用它:用一个字符串数组主要参数,或者用一个字符串数组主要参数。
完成签字 function greet(person: unknown): unknown { ... }
包括了这一函数公式如何运行的适度逻辑性。
如今,和之前一样,能用字符串数组或字符串数组种类的参数来启用 greet()
。
greet('World'); // 'Hello, World!'
greet(['小编', '大冶']); // ['Hello, 小编!', 'Hello, 大冶!']
2.1 轻载签字是可以调用的
尽管完成签字完成了函数公式个人行为,但它无法直接启用。仅有轻载签字是可以调用的。
greet('World'); // 轻载签字可启用
greet(['小编', '大冶']); // 轻载签字可启用
const someValue: unknown = 'Unknown';
greet(someValue); // Implementation signature NOT callable
// 出错
No overload matches this call.
Overload 1 of 2, '(person: string): string', gave the following error.
Argument of type 'unknown' is not assignable to parameter of type 'string'.
Overload 2 of 2, '(persons: string[]): string[]', gave the following error.
Argument of type 'unknown' is not assignable to parameter of type 'string[]'.
在后面的实例中,即便完成签字接纳unknown
主要参数,也无法使用为非 unknown (greet(someValue))
的参数启用 greet()
函数公式。
2.2 完成签字一定要通用
// 轻载签字
function greet(person: string): string;
function greet(persons: string[]): string[];
// 此轻载签字与其说完成签字兼容问题。
// 完成签字
function greet(person: unknown): string {
// ...
throw new Error('Unable to greet');
}
轻载签字函数公式 greet(person: string[]): string[]
被标记为与greet(person: unknown): string
兼容问题。
完成签字的 string
返回类型不足通用性,不能和轻载签字的 string[]
返回类型适配。
3.方法重载
尽管在之前的例子中,函数重载被用于一个普通函数公式。可是我们还可以轻载一个方法
在方法重载区段,轻载签字和实现签名全是类一部分了。
比如,大家实现一个 Greeter
类,有一个重载方法greet()
。
class Greeter {
message: string;
constructor(message: string) {
this.message = message;
}
// 轻载签字
greet(person: string): string;
greet(persons: string[]): string[];
// 完成签字
greet(person: unknown): unknown {
if (typeof person === 'string') {
return `${this.message}, ${person}!`;
} else if (Array.isArray(person)) {
return person.map(name => `${this.message}, ${name}!`);
}
throw new Error('Unable to greet');
}
Greeter 类包括 greet()
重载方法:2个轻载签字叙述怎样启用此方法,及其包括恰当完成的实现签字
因为方法重载,我们可以通过两种形式启用 hi.greet()
:使用一个字符串数组或使用一个字符串数组做为主要参数。
const hi = new Greeter('Hi');
hi.greet('小编'); // 'Hi, 小编!'
hi.greet(['王大冶', '大冶']); // ['Hi, 王大冶!', 'Hi, 大冶!']
4. 什么时候应用函数重载
函数重载,如果采用恰当,能够大大增加很有可能以多种形式调用的函数的易用性。这一点在自动补全时非常实用:我们将在自动补全中列举全部可能性的轻载纪录。
但是,在某些情况下,不建议应用函数重载,而应该使用函数签名。
比如,不能对可选参数应用函数重载:
// 不建议作法
function myFunc(): string;
function myFunc(param1: string): string;
function myFunc(param1: string, param2: string): string;
function myFunc(...args: string[]): string {
// implementation...
}
在函数签名中应用可选参数是充足的:
// 强烈推荐作法
function myFunc(param1?: string, param2: string): string {
// implementation...
}
5.汇总
TypeScript里的函数重载使我们界定以多种形式调用的函数公式。
应用函数重载必须界定轻载签字:一组含有参数和返回类型的函数公式,但却没有行为主体。这种签字说明该如何启用该函数公式。
除此之外,你需要写下函数的恰当完成(完成签字):参数和返回类型,及其函数体。一定要注意,完成签字是无法调用的。
除了常规的函数公式以外,类里的方式还可以轻载。
英文原文详细地址:https://dmitripavltin.com/typeript-function-overloading/
创作者: dmitripavlutin
译员:前面小编
大量程序编写基本知识,请访问:编程学习!!
以上就是关于TypeScript中怎么写函数重载?书写推荐的具体内容,大量欢迎关注AdminJS其他类似文章!