Generics(泛型)允许编写通用代码,可以与不同类型一起工作,同时保持严格的类型安全性。
使用语法:
function identity<T>(value: T): T { return value; } const x = identity<string>('test'); // T = string
应用场景:
带类型约束的示例:
function getFirst<T extends { length: number }>(arr: T): T { return arr[0]; }
问题:调用带泛型参数的函数时,是否必须指定具体类型?
回答:
不一定。TypeScript 会根据传递的值推导(推断)类型,如果可能的话。但有时明确指定是方便的,例如,如果从值的类型不明确或存在多种选择时。
function identity<T>(value: T): T { return value; } identity(5); // T = number(自动) identity<string>('s'); // T = string(显式)
故事
在电子商务项目中编写了针对不同实体的泛型仓库,但忘记了类型约束。结果可以放入任何对象,曾经保存了一个具有不兼容字段的实体。类型没有保护住错误。
故事
将模板函数传递了一个数组,期待获得一个元素类型的数组。但函数返回了 any[],因为没有明确指定泛型,TypeScript 无法推导类型。错误仅在生产环境中发现。
故事
初学者开发者创建了一个没有类型约束的泛型类,使用了一个在所有类型中都不存在的字段。编译器没有报错,但访问不存在的属性时所有功能都崩溃了。