从Typescript 3.4 开始,您可以使用keyof typeof 和const assertions 的组合来创建可以与枚举具有相同类型安全性的对象,并且仍然可以保存复杂值。
通过创建与const 同名的type,您可以进行与普通枚举相同的详尽检查。
唯一的缺点是你需要复杂对象中的一些键(我在这里使用value)来保存枚举成员的名称(如果有人能找出一个可以在类型安全的方式,我很想看到它!我无法让一个工作)。
export const PizzaSize = {
small: { value: 'small', key: 0, size: 25 },
medium: { value: 'medium', key: 1, size: 35 },
large: { value: 'large', key: 2, size: 50 },
} as const
export type PizzaSize = keyof typeof PizzaSize
// if you remove any of these cases, the function won't compile
// because it can't guarantee that you've returned a string
export function order(p: PizzaSize): string {
switch (p) {
case PizzaSize.small.value: return 'just for show'
case PizzaSize.medium.value: return 'just for show'
case PizzaSize.large.value: return 'just for show'
}
}
// you can also just hardcode the strings,
// they'll be type checked
export function order(p: PizzaSize): string {
switch (p) {
case 'small': return 'just for show'
case 'medium': return 'just for show'
case 'large': return 'just for show'
}
}
在其他文件中这个可以简单的使用,只需要导入PizzaSize即可。
import { PizzaSize } from './pizza'
console.log(PizzaSize.small.key)
type Order = { size: PizzaSize, person: string }
还要注意即使是通常可变的对象也不能使用as const 语法进行变异。
const Thing = {
ONE: { one: [1, 2, 3] }
} as const
// this won't compile!! Yay!!
Thing.ONE.one.splice(1, 0, 0)