我想获得从配置对象推断出的此对象类型中 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
。有什么想法吗?
答案 0 :(得分:2)
可能存在边缘情况,但这里有一个适用于您的示例的实现:
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>
中。