ts 中属性只是枚举中的某一个

image.png

例如接口中定义的type,想让它只是 Type 这个枚举中的某一个值,例如 'y'

阅读 6.6k
3 个回答

可以使用只读的 object 来替代 enum 的作用:

const Type = {
  Byte: 'y',
  Boolean: 'b'
} as const;  // <-- 关键技巧 1: as const

type Type = typeof Type; // <-- 关键技巧 2: 用 typeof 关键字从 object 反向创建同名类型

interface Property {
  name: string;
  type: Type[keyof Type];
}

const prop1: Property = {
  name: 'foo',
  type: 'y'  // valid ✅
};

const prop2: Property = {
  name: 'foo',
  type: Type.Byte  // valid ✅
};

但我必须指出 type: 'y' 这样的用法是 anti-pattern. 使用 enum 的出发点就是为了强制程序员只从 enum 读取值,从而规避使用 string literal 来避免错误。

直接类型设置为 'y' 或者 Type.Byte 不行吗?

不是只有一个y