主题
如何为 TS 类对象动态添加成员?
如果类实例需要支持动态键,最直接的写法是给类加索引签名。
ts
class User {
[key: string]: unknown
}这样实例对象就允许通过任意字符串键挂载成员:
ts
const user = new User()
user.name = 'Lee'
user.age = 18这种写法的代价
索引签名虽然灵活,但会明显放宽类型约束。
例如:
- 任意字符串键都变得合法
- 属性类型通常会被放宽成
unknown、any或统一联合类型
所以它更适合“字典对象”或“动态表单数据”这类场景,不适合严格建模的实体类。
如果只是少量可选字段
更推荐直接显式声明字段,而不是开放任意键:
ts
class User {
name?: string
age?: number
}使用建议
- 真的需要任意动态键时,再使用索引签名。
- 能明确字段结构时,优先写成确定属性。
- 不建议直接用
any,优先用unknown或更具体的联合类型。
