TypeScript中如何定义含`_vars`特殊类型的对象类型?
TypeScript 实现指定属性类型+其余属性统一类型的对象
你原来的写法报错是因为字符串索引签名[k:string]: string会约束所有字符串键的属性必须符合string类型,而_vars的类型是Record<string, any> | undefined,和索引签名的类型冲突了。
要实现你的需求,可以用交叉类型结合Exclude工具类型来避开索引签名对_vars的约束:
type XY = { _vars?: Record<string, any>; } & Record<Exclude<string, "_vars">, string>;
原理说明
- 第一个对象类型单独定义
_vars的可选属性,类型为Record<string, any> Record<Exclude<string, "_vars">, string>表示:除了_vars之外的所有字符串键,对应的值必须是string类型- 交叉类型将两部分合并,既保留了
_vars的特殊类型,又约束了其他所有属性的类型
验证示例
// 符合要求:_vars是合法的Record,其余属性都是string const valid1: XY = { username: "john_doe", email: "john@example.com", _vars: { theme: "dark", permissions: ["read", "write"] } }; // 符合要求:可以不包含_vars const valid2: XY = { id: "user_12345" }; // 不符合要求:_vars不是Record类型 const invalid1: XY = { _vars: "not-a-record" // 类型报错 }; // 不符合要求:非_vars属性不是string const invalid2: XY = { age: 28 // 类型报错 };
内容的提问来源于stack exchange,提问作者Andrew Ooi
相关产品推荐
相关产品推荐

