gpt4 book ai didi

嵌套对象类型的 TypeScript keyof

转载 作者:行者123 更新时间:2023-12-05 01:07:53 36 4
gpt4 key购买 nike

我想从配置对象推断出此对象类型中 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;
};
};
};

}

请注意,配置可以在 states 下嵌套 on 键。现在我可以使用以下方法获取第一级 key :

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"

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

Playground link to code

关于嵌套对象类型的 TypeScript keyof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66810267/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com