假设我有一个对象,我想确保它的键符合另一种类型。我正在创建一个Map键的字典,左边是原始的,右边是显示的键。我需要在运行时和编译时都可以使用它,所以作为const
对象和数组来做这件事似乎是有意义的?
(Yes,我尝试用一个元组数组来做这件事,但是TypeScript现在对我很生气)。
const allowedKeys = ["cheese_type", "jalapeno_qty", "pepperoni"] as const;
const keyMap = {
cheese_type: "Cheese type",
jalapeno_qty: "Number of jalapeños",
pepperoni: "Pepperoni",
} as const;
这给了我一个类型,它显式地Map了所有的键:
const keyMap: {
readonly cheese_type: "Cheese type";
readonly jalapeno_qty: "Number of jalapeños";
readonly pepperoni: "Pepperoni";
}
(我也可以导出类型)
export const Keys = typeof allowedKeys
export const KeyMap = typeof keyMap
但是我也想保护keyMap
不被意外地拼错或添加不应该有的键,所以我想使它符合allowedKeys
数组。
但是如果我这样做了,我就不知道如何将对象值推断或定义为readonly/const属性……
const allowedKeys = ["cheese_type", "jalapeno_qty", "pepperoni"] as const;
type Keys = typeof allowedKeys;
const keyMap: {
[key in Keys]: string // oh no
} = {
cheese_type: "Cheese type",
jalapeno_qty: "Number of jalapeños",
pepperoni: "Pepperoni",
} as const;
有没有什么方法可以做到这一点,不会让我陷入疯狂的循环,比如:
const keyMap: {
[key in Keys]: key in keyMap ? keyMap[key] : never; // haha no
} = {
cheese_type: "Cheese type",
jalapeno_qty: "Number of jalapeños",
pepperoni: "Pepperoni",
} as const;
(最终,我希望能够有两套我可以参考的密钥...)
export type RawKey = typeof keyMap;
export type DisplayKey = ValueOf<typeof keyMap>;
2条答案
按热度按时间sdnqo3pr1#
您可以使用
satisfies
操作符来检查值是否与特定类型匹配,而无需将其扩展到可能会丢弃所需信息的类型。所以只要你有
Keys
类型的键,你就可以允许:你可以说
keyMap
satisfies Record<Keys, string>
:然后
keyMap
仍然记住其属性的所有文字类型:如果你在
keyMap
上犯了错误,编译器应该会捕捉到它们:Playground链接到代码
0yycz8jy2#
您可以:
这将防止向
keyMap
添加其他密钥。编辑:关于粉红色的评论,你可以这样做
将
keyMap
设为只读。