TypeScript 泛型深度解析
泛型的本质
泛型(Generics)是类型系统中的"占位符"——允许你编写与具体类型无关的通用代码,同时保留完整的类型安全。
// 没有泛型:要么 any,要么重复代码
function identity(arg: any): any { return arg; }
// 有泛型:类型安全 + 通用
function identity<T>(arg: T): T { return arg; }
const str = identity("hello"); // 推导为 string
const num = identity(42); // 推导为 number
约束泛型
interface HasLength {
length: number;
}
function logLength<T extends HasLength>(arg: T): T {
console.log(arg.length);
return arg;
}
logLength("hello"); // ✅
logLength([1, 2, 3]); // ✅
logLength(42); // ❌ number 没有 length
条件类型
type IsArray<T> = T extends unknown[] ? true : false;
type A = IsArray<string[]>; // true
type B = IsArray<string>; // false
// 实用场景:提取 Promise 的值类型
type Awaited<T> = T extends Promise<infer U> ? U : T;
type Value = Awaited<Promise<string>>; // string
映射类型
// 将所有属性变为可选
type Partial<T> = { [K in keyof T]?: T[K] };
// 将所有属性变为只读
type Readonly<T> = { readonly [K in keyof T]: T[K] };
// 只保留部分属性
type Pick<T, K extends keyof T> = { [P in K]: T[P] };
总结
TypeScript 的类型系统本身就是一门图灵完备的语言。掌握泛型、条件类型和映射类型,能让你编写出真正通用且类型安全的代码,减少重复的类型定义。