泛型不是 any 的别名
泛型把“输入和输出之间的关系”保留下来。它适合描述同一算法处理多种数据,不适合掩盖两个不相关的结构。
ts
function first<T>(items: readonly T[]): T | undefined {
return items[0];
}
const firstId = first(['u1', 'u2']); // string | undefined
const firstCount = first([1, 2]); // number | undefined约束用于表达算法真正需要的能力:
ts
function byId<T extends { id: string }>(items: readonly T[], id: string) {
return items.find(item => item.id === id);
}不要把 T extends object 当作字段契约;它几乎没有说明对象能做什么。
练习
实现 indexById,接收只读数组和 id,返回 Map<string, T>。要求输入元素必须有字符串 id,并保持原数组元素类型。