泛型允许你编写由类型参数化的可复用代码——一个"类型变量"在代码被使用时被填入。它们提供无需牺牲类型安全性的复用(替代方案any会失去类型安全)。
ts
(): { arr[]; }
first<T>(: T[]): T { arr[]; }
n = ([, , ]);
s = ([, ]);
泛型允许你编写由类型参数化的可复用代码——一个"类型变量"在代码被使用时被填入。它们提供无需牺牲类型安全性的复用(替代方案any会失去类型安全)。
(): { arr[]; }
first<T>(: T[]): T { arr[]; }
n = ([, , ]);
s = ([, ]);
T是一个占位符;TypeScript从参数中推断它,因此返回类型是精确的——first([1,2])返回number,而不是any。
interface ApiResponse<T> { data: T; status: number; }
const res: ApiResponse<User> = await getUser(); // res.data is User
class Box<T> {
constructor(private value: T) {}
get(): T { return this.value; }
}
const box = new Box(123); // Box<number>
function pair<K, V>(k: K, v: V): [K, V] { return [k, v]; }
pair("id", 42); // [string, number]
泛型为TypeScript中的几乎所有可复用的抽象提供支持:Array<T>、Promise<T>、Map<K,V>、React的useState<T>、数据获取工具和集合。
它们让一个实现适用于多种类型,同时从头到尾保留完整的类型信息——输入和输出类型之间的关系被保留,而不是被抹去。