ts 对象中的动态属性约束

203 阅读1分钟

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}`;
}