Javascript TypeScript:有没有一种方法可以通过Object.values对返回的数组执行常量断言?
以下是现场演示: 这是错误消息 “const”断言只能应用于对枚举的引用 成员,或字符串、数字、布尔值、数组或对象文字Javascript TypeScript:有没有一种方法可以通过Object.values对返回的数组执行常量断言?,javascript,typescript,Javascript,Typescript,以下是现场演示: 这是错误消息 “const”断言只能应用于对枚举的引用 成员,或字符串、数字、布尔值、数组或对象文字 我不确定这里缺少了什么,因为Object.values确实返回了一个数组。为什么我不能对它进行常量断言呢?它不完全是常量断言,但您可以执行以下操作: 作为只读数组而不是作为常量 无法执行此操作的原因是,常量断言X as const的左侧X必须是TypeScript编译器知道的文本值 所以我假设你的最终目标是,你想拥有完整类型的A。没有任何特殊的东西,你会得到: const a:
我不确定这里缺少了什么,因为
Object.values
确实返回了一个数组。为什么我不能对它进行常量断言呢?它不完全是常量断言,但您可以执行以下操作:
作为只读数组
而不是作为常量
无法执行此操作的原因是,常量断言
X as const
的左侧X必须是TypeScript编译器知道的文本值
所以我假设你的最终目标是,你想拥有完整类型的A。没有任何特殊的东西,你会得到:
const a: {
label: Keys;
id: string;
}[]
const a: [
{
label: "one";
id: "0";
},
{
label: "two";
id: "1";
}
]
现在,如果你想得到这个:
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)
}));
但我认为这是我们在不依赖typescript对类型排序的情况下所能做的最好的事情。它应该读为:“…数组[文字]或对象文字。“文字”限定符在这里指的是所有字符串、数字、数组和对象。您可以执行.map(…作为常量)
这将导致隐式常量a:{只读标签:键;只读id:string;}[]