javascript - TypeScript:有没有办法对 Object.values 返回的数组进行 const 断言?

标签 javascript typescript

这是现场演示: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;

这是错误消息

A 'const' assertions can only be applied to references to enum members, or string, number, boolean, array, or object literals.


我不确定我在这里缺少什么,因为 Object.values确实返回一个数组。为什么我不能对它进行 const 断言

最佳答案

你不能这样做的原因是因为左边X const 断言的 X as const必须是 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;
})[]
但这是我认为我们可以做到的最好的事情,而不取决于 typescript 如何对类型进行排序。

关于javascript - TypeScript:有没有办法对 Object.values 返回的数组进行 const 断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63769483/

相关文章:

javascript - 如何获取与 Chrome 性能监视器中相同的节点

javascript - 如何在javascript中每秒更新日期时间

javascript - 向下滑动div上的关闭按钮 - jQuery

Typescript React 组件装饰器

javascript - jQuery promise 出现意外的 "then"调用顺序

javascript - react : How can I set my components' render content from outside?

javascript - Kendo UI Drawing API 导出 PDF 过早拆分 html 表格,在页面上生成无用的空白空间

javascript - 只读与禁用我的代码有什么问题?

typescript - 如何告诉 typescript value 是一个空对象?

javascript - 将数据传递给 ngAfterViewInit() 内的函数 - Angular 6