终於20天了,那个心情就是有点开心快结束了,但对後面10篇感到担忧,既期待又怕无法完赛 XDD
好啦,讲完废话,今天要来讲 Function Overloads, 接触到这个功能觉得 cool, JavaScript 绝对不能这麽做, 因为会有 hoisting 现象。让我们看下去~
若有错误,欢迎留言指教,感恩的心。
函式超载指的是扩充一个函式可以被执行的形式。简单来说就是针对同一个 function 提供多个不同的 type definition。可以使用相同的 function 名称,定义不同的参数数量或型别创建多种方法。
Function Overload 会包含两个部分:
例子1:
如下面例子, padding function (设定 css 的 padding)你要传入的参数, 有可能是1 个,2 个或 4 个, 我们就可以使用 Function Overloads 来进行约束。像这个例子如果不小心带入 3 个参数则会提醒 No overload expects 3 arguments
。
// overload signatures 定义
function padding(all: number): object;
function padding(topAndBottom: number, leftAndRight: number): object;
function padding(top: number, right: number, bottom: number, left: number): object;
// function implementation 实际执行的function
function padding(a: number, b?: number, c?: number, d?: number) {
if (b === undefined && c === undefined && d === undefined) {
b = c = d = a;
} else if (c === undefined && d === undefined) {
c = a;
d = b;
}
return {
top: a,
right: b,
bottom: c,
left: d
};
}
padding(1); // ok: all
padding(1, 1); // ok: topAndBottom, leftAndRight
padding(1, 1, 1, 1); // ok: top, right, bottom, left
padding(1, 1, 1); // Error: No overload expects 3 arguments, but overloads do exist that expect either 2 or 4
以这个例子, 我们可以看到 compiler 会标记有 +2 overloads
,他会自动侦测到你在使用 function overloads,蛮 cool 的。
例子2:
//overload signatures
function makeDate(timestamp: number): Date;
function makeDate(m: number, d: number, y: number): Date;
//function implementation
function makeDate(mOrTimestamp: number, d?: number, y?: number): Date {
if (d !== undefined && y !== undefined) {
return new Date(y, mOrTimestamp, d);
} else {
return new Date(mOrTimestamp);
}
}
const d1 = makeDate(12345678); //ok
const d2 = makeDate(5, 5, 5); //ok
const d3 = makeDate(1, 3); //error: No overload expects 2 arguments, but overloads do exist that expect either 1 or 3 arguments.
❌ 以下范例, 他预期不带参数执行 fn();
会印出 "hello"
,但结果报错,因为只有定义会带入x: string
,会带入1个参数,结果没有带入参数所以报错提醒。
function fn(x: string): void;
function fn() {
console.log("hello");
}
fn(); //error: Expected 1 arguments, but got 0.
✅ 再加入无参数的 overload signatures 即可。
function fn(x: string): void;
function fn(): void;
function fn() {
console.log("hello");
}
fn();
❌ 在实际执行函式带入的参数型别只有 boolean, 第二个 overload signatures 的参数型别为string, 就与执行函式参数无法兼容。
//overload signatures
function fn(x: boolean): void;
function fn(x: string): void; //error:This overload signature is not compatible with its implementation signature.
//function implementation 执行函式
function fn(x: boolean) {
console.log("hello");
}
✅ 如果要兼容的话, 就使用联合型别 union type 即可。
function fn(x: boolean): void;
function fn(x: string): void;
function fn(x: boolean | string) {
console.log("hello");
}
fn(""); //"hello"
下一篇要来笔记 Generic 泛型, 明天见!
https://www.typescriptlang.org/docs/handbook/2/functions.html#function-overloads
https://pjchender.dev/typescript/ts-functions/#function-overload%E5%87%BD%E5%BC%8F%E8%B6%85%E8%BC%89
https://basarat.gitbook.io/typescript/type-system/functions#overloading
<<: Day 21 评估Privacy by Design实作
接续昨天的练习 1.新增一个Adjustment Layer 2.套上Optics Compensa...
庆祝国庆日啦 成功的 失败的 import "./styles.css"; im...
Vim的基本操作、模式与状态列 [系列文目录] 在使用Vim之前,让我们来认识一下Vim的模式(Mo...
Q: 倒数 8 篇了!逐渐进入养老阶段,会一直Loading吗? A: Loading只是代表,主...
如果读者经常泡在 GitHub 上浏览他人的 C 语言专案,应该很常会看到名为 Makefile 的...