泛型,可以帮助我们创建可复用的类、接口和函数:
// 泛型的类
class KeyValuePair<K, V> {
constructor(public key: K, public value: V) {}
}
// 泛型的接口
interface Result<T> {
data: T | null;
}
// 泛型的函数
function wrapInArray<T>(value: T) {
return [value];
}
限制泛型
可以通过extends
关键字限制泛型:
// 限制泛型只能是number或者string类型
function echo1<T extends number | string>(value: T) {}
// 限制泛型的形状
function echo2<T extends { name: string }>(value: T) {}
// 限制泛型的类(Person或者Person的子类)
function echo3<T extends Person>(value: T) {}
拓展泛型类
当我们拓展一个泛型类时,子类有两种选择:1. 使用泛型;2. 不使用泛型。
class Store<T> {}
// 子类使用泛型
class CompressableStore<T> extends Store<T> {}
// 子类不使用泛型
class SearchableStore extends Store<string> {}
子类除了可以使用泛型,还可以添加泛型限制:
// 子类限定泛型的形状
class ProductStore<T extends { name: string }> extends Store<T> {}
keyof操作符
keyof
是一个特殊的操作符,用于获取对象类型的所有键(属性名)的联合类型。
interface Person {
name: string;
age: number;
address: string;
}
type PersonKeys = keyof Person;
// PersonKeys 类型为 "name" | "age" | "address"
keyof操作符在处理对象类型时非常有用。它可以让我们根据对象的键来动态访问对象的属性,而不必事先知道具体的键名。例如,可以使用keyof和索引签名来创建一个通用的getProperty函数,该函数接受一个对象和一个键名,并返回相应属性的值:
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
工具类型(Utility Types)
TypeScript 提供了一系列实用的工具类型,用于简化常见的类型操作。以下是 TypeScript 中一些常用的工具类型及其功能:
- Partial<T>: 将类型 T 的所有属性变为可选。它创建一个新的类型,其中原始类型 T 的所有属性都变为可选属性。
interface Person {
name: string;
age: number;
}
type PartialPerson = Partial<Person>;
// 相当于
// type PartialPerson = {
// name?: string;
// age?: number;
// };
- Required<T>: 将类型 T 的所有属性变为必需。它创建一个新的类型,其中原始类型 T 的所有属性都变为必需属性。
interface Person {
name?: string;
age?: number;
}
type RequiredPerson = Required<Person>;
// 相当于
// type RequiredPerson = {
// name: string;
// age: number;
// };
- Pick<T, K>: 从类型 T 中选择属性 K。它创建一个新的类型,其中只包含原始类型 T 中指定的属性 K。
interface Person {
name: string;
age: number;
address: string;
}
type PickPerson = Pick<Person, 'name' | 'age'>;
// 相当于
// type PickPerson = {
// name: string;
// age: number;
// };
-
Omit<T, K>: 从类型 T 中排除属性 K。它创建一个新的类型,其中不包含原始类型 T 中指定的属性 K。
-
Record<K, T>: 创建一个类型,其属性键为 K,属性值为 T。它创建一个新的类型,其中属性键为 K,属性值为 T。
-
Exclude<T, U>: 从类型 T 中排除与类型 U 相交的部分。它创建一个新的类型,其中从原始类型 T 中排除了与类型 U 相交的部分。
-
Extract<T, U>: 从类型 T 中提取与类型 U 相交的部分。它创建一个新的类型,其中只包含原始类型 T 中与类型 U 相交的部分。
-
NonNullable<T>: 从类型 T 中排除 null 和 undefined。它创建一个新的类型,其中从原始类型 T 中排除了 null 和 undefined。
-
Readonly<T>: 将类型 T 的所有属性变为只读。它创建一个新的类型,其中原始类型 T 的所有属性都变为只读属性。
这些工具类型可以通过 TypeScript 的标准库直接使用,无需安装额外的包或模块。它们可以帮助简化复杂的类型操作,提高代码的可读性和可维护性。
网友评论