遇到这个问题的是代码中存在一个魔法值,然后这个魔法值是 ts 一个 interface 的属性,比如下面这个
export interface People {
name: string;
age: number;
}
// ...
let filterKey = "name";
为了解决魔法值,我第一时间是想着去定义一个 const
变量或者枚举类型,比如下面这个
const PEOPLE_FILTER_KEY = "name";
// or
enum PeopleKeys = {
NAME: "name";
AGE: "age";
}
但我已经定义好了 People
这个 interface, 没道理还要再写一遍 enum
啊?就没有一种直接自动转换 key 为 enum
的吗?
后面找到 keyof
可以将 interface
的 key
自动转换为联合类型,也就是下面这样
type PeopleKeys = keyof People // 等同于 peoples = "name" | "age";
现在就是回到这个问题上,有很多人说 ts 在联合类型上完全能够替代枚举类型,但在魔法值的场景下,可能就是两种不同的情况,比如下面这样
// 枚举
let filterKey = PeopleKeys.NAME;
// 联合类型
let filterKey = "name" as PeopleKeys;
然后你们认为哪一种方式在魔法值场景下更加有效?