将对象的键用作联合类型

6

我有一个对象(让它被冻结,这样typescript可以更好地处理它的键):

const obj = Object.freeze({
    'hello': 64,
    'world': 20
}) as {[key: string]: number};
现在我有一个函数,用户可以通过键选择值:
const pick = (keys: Array<string>): Array<number> => {
    const values = [];

    for (const key of keys) {

        // Check if object contains property-key
        if (!(key in obj)) {
            throw new Error(`There's no such key: ${key}`);
        }

        values.push(obj[key]);
    }

    return values;
};
到目前为止,看起来一切都很好,并且在运行时无缝运作,我会检查用户是否传递了任何无效的键。但是我如何告诉TS只能使用obj中的键? 我可以使用Array<'hello' | 'world'>,但每次添加obj的新属性时都需要更新它,这有点麻烦。 相关问题,但它们似乎都使用类型,而我只有一个对象(如果有帮助,它可以被冻结):
  1. 创建以类型键为基础的对象联合类型(他得到了一个类型,我只有一个对象)
  2. 按对象值的类型过滤并获取对象键的联合类型(基本上与1.相同,但他想要type,而我正在尝试从我的对象中构建类型)
  3. 获取TypeScript联合对象的键(看起来不错,但他也有一个类型...)
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
13
const obj = Object.freeze({
    'hello': 64,
    'world': 20
});

const pick = (keys: Array<keyof typeof obj>) {...}

正如您所看到的,我已删除as {[key: string]: number};,因为它扩大了类型,而您希望它是严格的。

下一步是Array<keyof typeof obj>,我在这里声明只接受来自obj类型的键数组作为参数。

Array<keyof typeof obj>会动态评估为("hello" | "world")[],幸运的是,它将反映obj中的每个更改,正如您所希望的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,