定义函数
// function
function Add(a: number, b: number) {
return a + b;
}
// 用变量定义函数类型
let Add = (a: number, b: number) => number;
// 接口
interface Add {
(a: number, b: number): number;
}
// 类型别名
type Add = (a: number, b: number) => number;
可选参数和默认参数
- 默认
TypeScript 里的每个函数参数都是必须的。 传递给一个函数的参数个数必须与函数期望的参数个数一致。
- 可选
在参数名旁使用 ?实现可选参数的功能。 可选参数必须跟在必须参数后面。
/*
** 可选参数 & 默认参数
*/
function Add05(x: number, y = 1, z?: number) {
return z ? x + y + z : x + y;
}
Add05(1); // 2
Add05(1, 2, 3); // 6
剩余参数:不确定参数个数
function Add06(...resetOfNumber: number[]) {
return resetOfNumber.reduce((pre, cur) => pre + cur);
}
console.log(Add06(1, 2, 3, 4, 5, 6));
重载
使用相同名称和不同参数数量或类型创建多个方法的一种能力。
-
背景
-
要求一个函数接受不同类型参数时,有不同的操作
-
想到了用联合类型 ?
type Combinable = string | number; function add(a: Combinable, b: Combinable) { if (typeof a === "string" || typeof b === "string") { return a.toString() + b.toString(); } return a + b; } const result = add("Semlinker", " Kakuqo"); result.split(" "); // error! Property 'split' does not exist on type 'Combinable'. // error! Property 'split' does not exist on type 'number'.很明显 Combinable 和 number 类型的对象上并不存在 split 属性。所以需要 重载 登场!
-
-
-
解决
为同一个函数提供多个函数类型定义,最终在类型宽泛的版本中实现,这就是函数重载。编译器会根据 类型定义列表 去处理函数的调用。/* ** 重载 */ function add07(...rest: number[]): number; function add07(...rest: string[]): string; function add07(...rest: any): any { let first = rest[0]; if (typeof first === "string") { return rest.join(""); } else if (typeof first === "number") { return rest.reduce((pre: number, cur: number) => pre + cur); } } console.log(add07(1, 2, 3, 4)); console.log(add07("1", "2", "3", "4"));
TypeScript 基础系列
- Hello TypeScript(01)-- 环境搭建
- Hello Typescript(02)-- 枚举类型
- Hello Typescript(03)-- 对象类型接口
- Hello Typescript(04)-- 函数类型接口、混合类型接口、类接口
- Hello Typescript(05)-- 函数
- Hello Typescript(06)-- 类
- Hello Typescript(07)-- 类与接口的关系
- Hello Typescript(08)-- 泛型
- Hello Typescript(09)-- 类型推断、类型兼容性、类型保护
- Hello Typescript(10)-- 交叉类型、联合类型、索引类型、映射类型、条件类型