📚 为什么需要泛型?
// 没有泛型:需要为每种类型写函数
function identityNumber(arg: number): number {
return arg;
}
function identityString(arg: string): string {
return arg;
}
// 使用 any:失去类型安全
function identityAny(arg: any): any {
return arg;
}
const result = identityAny(123); // 类型是 any,不是 number
// 使用泛型:保持类型安全 + 复用
function identity<T>(arg: T): T {
return arg;
}
const num = identity<number>(123); // 类型是 number
const str = identity<string>('hello'); // 类型是 string
// 类型推断:TypeScript 自动推断类型
const inferred = identity(true); // 类型是 boolean
💡
泛型优势
泛型允许我们编写可复用的代码,同时保持类型安全。函数/类/接口可以使用类型变量,在实际使用时确定具体类型。
🔧 泛型语法
// 泛型函数
function first<T>(arr: T[]): T | undefined {
return arr[0];
}
first<number>([1, 2, 3]); // number | undefined
first(['a', 'b', 'c']); // string | undefined (类型推断)
// 泛型箭头函数
const last = <T,>(arr: T[]): T | undefined => arr[arr.length - 1];
// 多个类型变量
function pair<K, V>(key: K, value: V): [K, V] {
return [key, value];
}
pair('name', 'Alice'); // [string, string]
pair(1, true); // [number, boolean]