使用对象的键作为联合类型

Sim*_*mon 2 types typescript union-types

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

const obj = Object.freeze({
    'hello': 64,
    'world': 20
}) as {[key: string]: number};
Run Code Online (Sandbox Code Playgroud)

现在我有一个功能,用户可以通过他们的键选择值:

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;
};
Run Code Online (Sandbox Code Playgroud)

到目前为止看起来不错,并且在运行时运行时完美无缺,我检查用户是否传递了任何无效密钥。但是我如何告诉 TS 只能obj使用来自的密钥?

我可以做,Array<'hello' | 'world'>但每次我添加新属性时都需要更新它,obj这有点烦人。

相关问题,但它们似乎都使用类型,而我只有一个对象(如果有帮助,可以将其冻结):

  1. 从类型键创建联合类型的对象(他有一个类型,我有一个对象)
  2. 获取按对象值类型过滤的对象键的联合类型(基本上与 1 相同。但他想要type而我正在尝试我的对象中构建一个类型)
  3. 在 TypeScript 中获取对象联合的键(看起来不错,但他也有一个类型......)

Mac*_*ora 7

const obj = Object.freeze({
    'hello': 64,
    'world': 20
});

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

Run Code Online (Sandbox Code Playgroud)

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

接下来的事情是Array<keyof typeof obj>我在这里声明,我只接受来自obj.

Array<keyof typeof obj>动态评估到("hello" | "world")[],幸好,你希望它会反映在原来的每一次变化obj