聊聊 Vue 3 中使用的函数重载有啥用?

开发 前端
当使用字符串阿宝哥作为参数调用 greet 函数时,将会返回 "Hello, 阿宝哥!"。那么现在问题来了,如果我们希望 greet 函数能同时支持输入用户列表并返回相应的问候列表那该咋办?

你知道下图中为什么定义了那么多个 ref 函数,它们的作用是什么?如果不清楚的话,阅读完本文的内容,也许你就懂了。

这是一个简单的 greet 函数,它接收一个字符串类型的参数,其返回值的类型也是字符串类型。

function greet(person: string): string {
return `Hello, ${person}!`;
}

当使用字符串阿宝哥作为参数调用 greet 函数时,将会返回 "Hello, 阿宝哥!"。那么现在问题来了,如果我们希望 greet 函数能同时支持输入用户列表并返回相应的问候列表那该咋办?

给你 3 秒钟的时间思考一下,你想到答案了么?其中一种方案是使用联合类型。

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");
}

而另一种解决方案是使用函数重载,使用函数重载技术,我们需要定义重载签名和实现签名。

其中重载签名定义了函数中每个参数的类型和函数的返回值类型,但不包含函数体。一个函数可以有多个重载签名。

而实现签名的参数类型和返回值类型都需要使用更通用的类型,且还会包含实现该签名的函数体。一个函数只能含有一个实现签名。

结合了重载签名和实现签名之后,我们就实现了前面所说的功能:

// 重载签名
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');
}

在实际使用的过程中,只有重载签名才是可以调用的,调用函数之后的返回值就能够被推导出正确的类型。

需要注意的是,当 TypeScript 编译器处理函数重载时,它会查找重载列表,尝试使用第一个重载定义。如果匹配的话就立即返回。当使用实现签名对应类型的参数调用实现签名函数时将会出现错误。

除了重载普通函数之外,我们也可以对类中的方法进行重载。方法重载是指在同一个类中方法同名,参数不同(参数类型不同、参数个数不同或参数个数相同时参数的先后顺序不同),调用时根据实参的形式,选择与它匹配的方法执行操作的一种技术。

下面我们来看一个方法重载的例子:

class Calculator {
add(a: number, b: number): number;
add(a: string, b: string): string;
add(a: string, b: number): string;
add(a: number, b: string): string;
add(a: string | number, b: string | number) {
if (typeof a === 'string' || typeof b === 'string') {
return a.toString() + b.toString();
}
return a + b;
}
}

const calculator = new Calculator();
const result = calculator.add('Semlinker', ' Kakuqo');

阅读完本文之后,你应该就知道 Vue 3 响应式模块中的 ref 函数背后使用了什么技术。

责任编辑:姜华 来源: 全栈修仙之路
相关推荐

2022-07-04 08:54:39

Swift处理器项目

2020-11-12 08:32:14

Vue3模板优化

2022-01-11 06:53:23

面试重写重载

2009-09-01 11:28:32

C#使用函数重载

2022-08-11 11:35:43

Vuev-model​表单

2024-07-26 08:50:57

2021-11-22 11:05:20

Vue 3setup前端

2024-10-15 07:42:09

Vue动态加载

2022-02-28 08:17:24

重载函数JS前端

2022-07-06 10:02:12

Vue3.2ExposeAPI

2021-08-01 07:58:58

Vue 加载组件

2020-02-10 10:23:03

VueJSX前端

2017-07-14 10:10:08

Vue.jsMixin

2022-03-29 08:30:47

指针数组C语言

2021-02-04 15:08:37

Vue渐进式框架

2024-06-03 10:00:51

Vue 3语法插槽

2022-02-23 08:18:06

nginx前端location

2024-04-07 00:00:10

Rust枚举C代码

2020-12-28 08:29:47

Vuecss框架

2024-07-12 08:56:40

点赞
收藏

51CTO技术栈公众号