泛型
设计泛型的关键目的是在成员之间提供有意义的约束,这些成员可以是:类的实例成员、类的方法、函数参数和函数返回值。
泛型接口
interface Identifity<T, U> {
username: T;
passwork: U;
}
// 想要返回两种类型的对象就可以使用泛型接口
function identity<T, U>(username: T, password: U): Identifity<T, U> {
return {
username,
password,
}
}
泛型类
interface GenericInterface<T> {
value: T;
getUser: () => T;
}
class Identity<T> implements GenericInterface<T> {
value: T;
constructor(value: T) {
this.value = value;
}
getUser(): T {
return this.value
}
}
泛型约束
// 检查对象上的键是否存在
interface UserInfo {
name: string;
age: number;
}
function getUser<T, U extends keyof T>(arg1: T, arg2: U): T[U] {
return arg1[arg2];
}
泛型工具类型
- Partial 的作用就是将某个类型里的属性全部变为可选项 ?
interface UserInfo {
name: string;
age: number;
}
function particalFn(arg1: UserInfo, arg2: Partial<UserInfo>) {
return { ...arg1, ...arg2 };
}
particalFn({ name: 'zs', age: 17}, { name: 'ls'});
- Record的作用是将 K 中所有的属性的值转化为 T 类型。
type UserType = 'zs' | 'ls' | 'ww';
function recordFn(arg1: UserInfo, arg2: Record<UserType, UserInfo>) {
return { ...arg1, ...arg2 };
}
recordFn(
{ name: 'zs', age: 17},
{
zs: {
name: 'xx',
age: 10,
},
ls: {
name: 'zs',
age: 10,
},
ww: {
name: 'zs',
age: 10,
},
}
);
- Pick<T, K extends keyof T> 的作用是将某个类型中的子属性挑出来,变成包含这个类型部分属性的子类型。
function pickFn(arg1: UserInfo, arg2: Pick<UserInfo, 'name'>) {
return { ...arg1, ...arg2 };
}
pickFn({ name: 'zs', age: 18 }, { name: 'ls'});
- Exclude<T, U> 的作用是将某个类型中属于另一个的类型移除掉。注意!:把联合属性中的某个字符串字面量剔除出去的能力
function excludeFn(arg1: UserInfo, arg2: Exclude<'name'| 'age', 'age'>) {
return { ...arg1 };
}
excludeFn({ name: 'zs', age: 18 }, 'name');
- Omit
function omitFn(arg1: UserInfo, arg2: Omit<UserInfo, 'age'>) {
return { ...arg1 };
}
excludeFn({ name: 'zs', age: 18 }, { name: 'ls'});
资料见:ts泛型