ts 如何严格约束 object 的key?
js 对象是经常使用的数据类型,为了方便开发,在 ts 中我们经常定义一个不定属性,
type MyObj = {
// ...一些确定属性
[k: stirng]: unknown;
}
但是这也导致我们不知道实际该对象上到底挂载了哪些属性,实际上还是弱化了 ts 的类型约束能力
进阶1:限制自由属性的前缀
如果可以约定某些临时属性一定是以_开头,也可以在一定程度上限制大家随意为 obj 添加属性,避免这样变量最终无法维护。此时该如何描述?
type MyObj = {
// ...一些确定属性
[k: `_${stirng}`]: unknown;
}
进阶2:根据枚举值自动生成object keys
如果本身已经有个一个枚举,然后每个枚举值将通过一定的拼接规则在 obj 中可以生成多个属性呢?
export enum ExpName {
NAME_ONE = 'name1',
}
export type TABSettingsRes = {
-readonly [K in keyof typeof ExpName as `flow_${(typeof ExpName)[K]}`]: string;
} & {
-readonly [K in keyof typeof ExpName as `variant_${(typeof ExpName)[K]}`]: 'control' | `variant_${number}`;
};
- -readonly 是为了将生成的属性声明为 writable.
这样效果就等同于
export enum ExpName {
NAME_ONE = 'name1',
}
export type TABSettingsRes = {
flow_name1: string;
variant_name1: 'control' | `variant_${number}`;
}