如何创建自定义Utility Type为任意对象类型新增额外字段?
实现WithAge工具类型的方案
你要的效果可以通过 TypeScript 的交叉类型实现,核心逻辑是把传入的原始类型和包含age字段的额外类型做合并,基础实现代码如下:
type WithAge<T> = T & { age: number }
这里的&是交叉类型运算符,会同时保留泛型T的所有原有字段,再叠加number类型的age字段,完全匹配你给出的用法示例。
如果需要更高的灵活度,可以做两个方向的扩展:
- 支持自定义age字段的类型,默认保留number类型:
// 第二个泛型参数可以指定age的类型,不传默认是number type WithAge<T, AgeType = number> = T & { age: AgeType } // 示例:age是字符串类型的场景 const person: WithAge<Person, string> = { name: "Foo", age: "25" }
- 封装成通用的扩展字段工具类型,支持一次性新增任意多个字段:
type Extend<T, ExtendFields> = T & ExtendFields // 示例:同时新增age和height两个字段 const person: Extend<Person, { age: number, height: number }> = { name: "Foo", age: 123, height: 180 }
注意事项
- 如果原始类型
T本身已经存在age字段,交叉后最终的age类型会是两个类型的交集,如果类型不兼容会得到never类型,使用时要避免字段重名冲突。 - 该实现同时支持
interface和type定义的类型作为入参,不需要额外做兼容处理。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

