编程后端开发者

什么是 TypeScript 中的 Generics 类型化,如何使用它编写通用函数和类?可能会遇到哪些陷阱?

用 Hintsage AI 助手通过面试

回答。

Generics(泛型)允许编写通用代码,可以与不同类型一起工作,同时保持严格的类型安全性。

使用语法:

function identity<T>(value: T): T { return value; } const x = identity<string>('test'); // T = string

应用场景:

  • 通用集合函数(map、filter 等)
  • 类(例如,Repository<Entity>
  • 接口(例如,泛型类型的 API 响应)

带类型约束的示例:

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 无法推导类型。错误仅在生产环境中发现。


故事

初学者开发者创建了一个没有类型约束的泛型类,使用了一个在所有类型中都不存在的字段。编译器没有报错,但访问不存在的属性时所有功能都崩溃了。