[英]TypeScript: is there a way to do const assertions on the array return by Object.values?
这是现场演示: https : //codesandbox.io/s/vigorous-rgb-u860z?file=/ src/ index.ts
enum Keys {
One = "one",
Two = "two"
}
const a = Object.values(Keys).map((value, index) => ({
label: value,
id: String(index)
})) as const;
这是错误信息
“const”断言只能应用于对枚举成员或字符串、数字、布尔值、数组或对象文字的引用。
我不确定我在这里缺少什么,因为Object.values
确实返回了一个数组。 为什么我不能对它进行 const 断言
您不能这样做的原因是因为 const 断言X as const
的左侧X
必须是 TypeScript 编译器知道的字面值。
所以我假设你的最终目标是你想要拥有完整类型的 A。没有任何特殊的东西,你会得到这个:
const a: {
label: Keys;
id: string;
}[]
现在如果你想得到这个:
const a: [
{
label: "one";
id: "0";
},
{
label: "two";
id: "1";
}
]
这实际上是不可能的,因为您依赖于Object.values
迭代顺序。 这是由 ES2015 定义的,但 typescript 类型不“知道”它。
通过一些简单的花哨类型,您可以:
type EnumEntry<T> = T extends any ? { label: T, id: string } : never;
const a: EnumEntry<Keys>[] = Object.values(Keys).map((value, index) => ({
label: value,
id: String(index)
}));
const a: ({
label: Keys.One;
id: string;
} | {
label: Keys.Two;
id: string;
})[]
但这是我认为我们可以做的最好的事情,而不取决于打字稿如何对类型进行排序。
它不完全是 const 断言,但您可以执行以下操作: as ReadonlyArray<{label: Keys, id: string}>
而不是as const
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.