繁体   English   中英

嵌套 object 类型的 TypeScript 键

[英]TypeScript keyof of nested object type

我想在从配置 object 推断的此 object 类型中获得所有键on联合:

type Config = {
initial: string;
states: {
    idle: {
        on: {
          START: string;
        };
        effect(): void;
    };
    running: {
        on: {
            PAUSE: string;
        };
        effect(): void;
    };
    paused: {
        initial: string;
        states: {
            frozen: {
                on: {
                    HEAT: string;
                };
            };
        };
        on: {
          RESET: string;
        };
    };
};

}

请注意,配置可以嵌套on states下的键上。 现在我可以使用以下方法获得第一级密钥:

type KeysOfTransition<Obj> = Obj extends Record<PropertyKey, any> ? keyof Obj : never;
type TransitionKeys = KeysOfTransition<Config["states"][keyof Config["states"]]["on"]>
// "START" | "PAUSE" | "RESET"

但我无法在嵌套的联合中获得HEAT 有任何想法吗?

可能存在边缘情况,但这里有一个适用于您的示例的实现:

type KeysUnder<T, K extends PropertyKey> =
  T extends object ? {
    [P in keyof T]-?: (P extends K ? keyof T[P] : never) | KeysUnder<T[P], K>
  }[keyof T] : never;
    
type ConfigOnKeys = KeysUnder<Config, "on">;
// type ConfigOnKeys = "START" | "PAUSE" | "RESET" | "HEAT"

这个想法是使用递归条件类型来深入了解 object 属性。 要获得KeysUnder<T, K> ,对于 object T ,我们查看每个属性键P 如果PK匹配(在您的用例中将"on" ),那么您需要其属性值类型T[P]的键。 递归位是我们还将所有这些键连接到KeysUnder<T[P], K>

Playground 代码链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM