Skip to content

如何为 TS 类对象动态添加成员?

如果类实例需要支持动态键,最直接的写法是给类加索引签名。

ts
class User {
  [key: string]: unknown
}

这样实例对象就允许通过任意字符串键挂载成员:

ts
const user = new User()

user.name = 'Lee'
user.age = 18

这种写法的代价

索引签名虽然灵活,但会明显放宽类型约束。

例如:

  • 任意字符串键都变得合法
  • 属性类型通常会被放宽成 unknownany 或统一联合类型

所以它更适合“字典对象”或“动态表单数据”这类场景,不适合严格建模的实体类。

如果只是少量可选字段

更推荐直接显式声明字段,而不是开放任意键:

ts
class User {
  name?: string
  age?: number
}

使用建议

  • 真的需要任意动态键时,再使用索引签名。
  • 能明确字段结构时,优先写成确定属性。
  • 不建议直接用 any,优先用 unknown 或更具体的联合类型。

基于 MIT 许可发布