【发布时间】:2020-07-08 22:11:05
【问题描述】:
如何保持文字表达式常量(通过 const 断言),但仍针对类型对其进行类型检查以防止缺少/多余的属性?
换句话说,如何防止类型注释覆盖as const断言,扩大类型?
我或多或少了解正在发生的事情,并且我已经在聊天中询问过,所以我很确定这没有解决方案(在类型土地上),但也许有一个我不知道的 hack关于。
用例:
我需要定义一个配置,我可以从中根据值有条件地推断类型,但同时我想确保配置包含与其所基于的类型完全相同的键。
这是一个最小的例子。 State 类型是键的蓝图,config 对象应该对这些键进行类型检查。但是,我还需要 config 是一个常量,以便我可以深入了解它并获得单元联合类型,而不是扩大的 string 类型。
type State = Readonly<{
a: number;
b: string;
}>;
const config: Record<keyof State, { value: string }> = {
a: { value: "aaa" },
b: { value: "bbb" }
} as const;
// I want this to be "aaa" | "bbb"
type ConfigValues = (typeof config)[keyof typeof config]["value"];
我可以这样做:
const config = {
a: { value: "aaa" },
b: { value: "bbb" }
} as const;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const config_check: Record<keyof State, any> = config;
但以上只会检查缺少的道具,而不是多余的道具:/。
请注意,这是一个简单的示例。在现实世界中,配置更复杂,我想推断的类型是基于值的条件。
另外,我已经多次遇到这种问题模式,所以它看起来不像是边缘情况。
【问题讨论】:
标签: javascript typescript