TS在函数中的部分应用
可选参数与rest参数:
可选参数:
可选参数必须放在必选参数后面,可以用?来表示可选参数,也可以定义一个默认值,既然有默认值那肯定是可选参数了。例子:
const foo1 = (name: string, age?: number, food: string = 'banana'): number => {
const inputAge = age || 18;
return name.length + inputAge + food.length;
}
rest 参数:
const foo2= (name: string, ...rest: any[]) => {}
也可以用元组来进行标注:
const foo2=(name:string,...rest:[string,boolean])=>{}
重载
函数重载签名:实现入参关联的返回值类型:
function func(foo: number, bar: true): string;
function func(foo: number, bar?: false): number;
function func(foo: number, bar?: boolean): string | number {
if (bar) {
return String(foo);
} else {
return foo * 599;
}
}
const res1 = func(599); // number
const res2 = func(599, true); // string
const res3 = func(599, false); // number
重载没太理解有什么意义,后续再学习~~T-T
异步函数,需要返回一个Promise<T>
async function asyncFunc(): Promise<void> {}
内置类型:any/unknown/never与类型断言
any:任意类型
unknown:表示未知类型。 unknown再次赋值,只能赋值给any和unknown类型。
any和unknown的最大区别:any放弃了所有类型检查,但是unknown并没有。
当类型未知时,可以使用unknown标注,结合类型断言使用。
never:不携带任何类型信息,never只能赋值给never
never被称为Bottom Type,是整个类型系统层级中最底层的类型。
类型断言
基本语法: as newType
用处:
在ts类型分析不正确或不符合预期时,将其断言为此处的正确类型
另外一个用处是做提示辅助功能,例如:
interface IStruct {
foo: string;
bar: {
barPropA: string;
barPropB: number;
barMethod: () => void;
baz: {
handler: () => Promise<void>;
};
};
}
如果要基于上面实现一个对象,可能会这样写:
const obj: IStruct = {};
但会出现一堆类型报错,提示你必须实现整个接口结构才行。如果此时使用类型断言,就能在保留类型提示的前提下,不那么完整地实现这个结构:
const obj = {
bar: {
baz: {}
}
} as IStruct
或者使用<>
const obj = <IStruct>{
bar: {
baz: {}
}
}
类型工具
类型别名可以声明自己能接受泛型,就变成了类型工具
type Factory<T> = T | number | string;
可以变得更加灵活:
const foo: Factory<boolean> = true;
联合类型和交叉类型
联合类型: | 满足其中一个就行了
交叉类型: & 必须同时满足
交叉类型&如果没有返回 会提示为never
type StrAndNum = string & number; // never
索引类型
通过索引的形式来进行类型操作
索引签名类型:快速声明一个键值类型一致的类型结构
interface AllStringTypes {
[key: string]: string;
}
只能声明string类型的键值。
const foo: AllStringTypes = {
"food": "599"
}
但由于 JavaScript 中,对于 obj[prop] 形式的访问会将数字索引访问转换为字符串索引访问,也就是说, obj[599] 和 obj[‘599’] 的效果是一致的。因此,在字符串索引签名类型中我们仍然可以声明数字类型的键。类似的,symbol 类型也是如此:
const foo: AllStringTypes = {
"linbudu": "599",
599: "linbudu",
[Symbol("ddd")]: 'symbol',
}
索引类型查询
keyof 可以将对象中的所有键转换为对应字面量类型,再组合成联合类型
keyof的产物必定是个联合类型
type TypesKey = keyof any
等同于
type TypesKey = string | number | symbol
索引类型访问
interface Foo {
propA: number;
propB: boolean;
}
type PropAType = Foo['propA']; // number
type PropBType = Foo['propB']; // boolean
通过keyof可以简化
interface Foo {
propA: number;
propB: boolean;
}
type PropAType = Foo[keyof Foo] // number | boolean
映射类型:
type Stringify<T> = {
[K in keyof T]: string;
};
进行克隆
type Clone<T> = {
[K in typeof T]: T[k];
};