泛型
-
在
TypeScript
中,泛型
(Generics
)是一种在编写可重用、灵活的代码时使用的工具。它允许我们在定义函数、类或接口时使用类型参数,以便在使用时指定具体的类型。 -
通过使用泛型,我们可以编写更通用的代码,而不仅仅限于特定的类型。
泛型提供了以下几个主要的用途和特性:
1. 函数泛型:函数泛型允许我们编写可以
接受不同类型参数并返回相同类型的函数
。我们可以使用<T>
或其他标识符作为泛型类型参数,并在函数参数和返回值中使用该参数。function identity<T>(arg: T): T {return arg; }
在上述示例中,
<T>
表示泛型类型参数。函数identity 接受一个参数 arg,其类型为 T
,并返回一个类型为 T 的值
。通过这种方式,我们可以使用identity
函数来处理不同类型的数据,而函数的输入和输出类型保持一致。2. 类泛型:
类泛型允许我们创建可以处理多种类型数据的类。我们可以使用
<T>
或其他标识符作为泛型类型参数,并在类的属性、方法或构造函数中使用该参数。class Box<T> {value: T;constructor(value: T) {this.value = value;} }
在上述示例中,
<T>
表示泛型类型参数。类Box<T>
中的属性value
的类型是泛型类型T
。通过使用类泛型,我们可以创建一个能够存储不同类型值的盒子。3. 接口泛型:
接口泛型允许我们定义具有多种类型成员的通用接口。我们可以使用
<T>
或其他标识符作为泛型类型参数,并在接口的属性、方法或其他成员中使用该参数。interface Pair<T, U> {first: T;second: U; }
在上述示例中,
<T, U>
表示泛型类型参数。接口Pair<T, U>
定义了具有first
和second
属性的泛型类型。通过使用接口泛型,我们可以定义适用于多种类型组合的通用接口。4. 泛型约束:
泛型约束允许我们对泛型类型进行更精细的限制。
通过指定某些条件,我们可以限制泛型类型必须具有特定的属性或遵循特定的接口
。function loggingIdentity<T extends Lengthwise>(arg: T): T {console.log(arg.length);return arg; }
在上述示例中,
<T extends Lengthwise>
表示泛型类型参数 T 受到Lengthwise
约束。这意味着传递给loggingIdentity
函数的参数必须具有Lengthwise
接口中的属性。通过使用泛型约束,我们可以更精确地定义泛型类型的行为。
5. 泛型工具类型-
Partial:
Partial<T>
是一个将泛型类型T
中的所有属性设置为可选的工具类型
。它将每个属性的类型都转换为可选属性,使我们可以对其进行部分更新。interface User {name: string;age: number; }
type PartialUser = Partial<User>; // PartialUser 的类型为 { name?: string; age?: number; }
在上述示例中,
Partial<User>
将User
接口的属性全部转换为可选属性,生成了一个新的类型PartialUser
。 -
Required:
Required<T>
是一个将泛型类型 T 中的所有属性设置为必需的工具类型
。它将每个属性的类型都转换为必需属性,即不能为undefined 或 null
。interface PartialUser {name?: string;age?: number; }type RequiredUser = Required<PartialUser>; // RequiredUser 的类型为 { name: string; age: number; }
在上述示例中,
Required<PartialUser>
将 PartialUser 类型的属性全部转换为必需属性,生成了一个新的类型RequiredUser
。 -
Pick<T, K>:
Pick<T, K>
是一个从泛型类型T
中选取部分属性的工具类型。它接受一个类型参数K
,该参数表示要选择的属性的键。interface User {name: string;age: number;email: string; }type UserBasicInfo = Pick<User, 'name' | 'age'>;// UserBasicInfo 的类型为 { name: string; age: number; }
在上述示例中,
Pick<User, 'name' | 'age'>
从User
接口中选取了name
和age
属性,生成了一个新的类型UserBasicInfo
。 -
Omit<T, K>:
Omit<T, K>
是一个从泛型类型T
中排除指定属性的工具类型。它接受一个类型参数K
,该参数表示要排除的属性的键。interface User {name: string;age: number;email: string; }type UserWithoutEmail = Omit<User, 'email'>;// UserWithoutEmail 的类型为 { name: string; age: number; }
在上述示例中,
Omit<User, 'email'>
从User
接口中排除了email
属性,生成了一个新的类型UserWithoutEmail
。除了上述示例中提到的工具类型,还有其他常用的泛型工具类型,如
Exclude<T, U>、Extract<T, U>、NonNullable<T>、ReturnType<T>
等。每个工具类型都有不同的用途和特性,可以根据具体的需求选择合适的工具类型来操作和转换泛型类型。
-