Javascript TypeScript:有没有一种方法可以通过Object.values对返回的数组执行常量断言?

Javascript TypeScript:有没有一种方法可以通过Object.values对返回的数组执行常量断言?,javascript,typescript,Javascript,Typescript,以下是现场演示: 这是错误消息 “const”断言只能应用于对枚举的引用 成员,或字符串、数字、布尔值、数组或对象文字 我不确定这里缺少了什么,因为Object.values确实返回了一个数组。为什么我不能对它进行常量断言呢?它不完全是常量断言,但您可以执行以下操作: 作为只读数组而不是作为常量 无法执行此操作的原因是,常量断言X as const的左侧X必须是TypeScript编译器知道的文本值 所以我假设你的最终目标是,你想拥有完整类型的A。没有任何特殊的东西,你会得到: const a:

以下是现场演示:

这是错误消息

“const”断言只能应用于对枚举的引用 成员,或字符串、数字、布尔值、数组或对象文字


我不确定这里缺少了什么,因为
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;}[]