以联合类型迭代子对象 - 打字稿

时间:2021-03-29 14:57:46

标签: typescript typescript-typings

我有一个联合类型,其中包含一个包含不同属性的子对象。有没有办法在函数中接受这个联合并以打字稿安全的方式迭代它的子对象的键?

// TYPES

type A = {
    bools: {
        a: boolean;
        b: boolean;
    };
};

type B = {
    bools: {
        b: boolean;
        c: boolean;
    };
};

type U = A | B;

// ATTEMPTED TYPING

type GetKeyGroups<T> = T extends T ? Array<keyof T> : never;
type keygroups = GetKeyGroups<U['bools']>

// WANTED USE

const a: A = {
    bools: {
        a: false,
        b: false,
    },
};

const test = ( obj: U ) => {
    const bools: U["bools"] = obj.bools
    const keys = Object.keys(bools) as keygroups

    keys.forEach((key) => console.log(bools[ key ]));
}

test(a)

这个 ^ 似乎是一个很好的解决方案,直到打字稿抱怨 keykeys.forEach((key) => console.log(bools[ key ])); 中属于 any 类型

有没有办法在当前版本的 TypeScript 中实现这一点?

1 个答案:

答案 0 :(得分:0)

当然。这样的事情应该可以工作

const test = ( obj: U ) => {
    const bools: U["bools"] = obj.bools
    const keys = Object.keys(bools) as (keyof typeof bools)[]

    keys.forEach((key) => console.log(bools[key]));
}