来自嵌套对象的TypeScript模板文字字符串
我想获得states此对象类型下所有键的联合,
我有一个嵌套的state键对象。我想以state点表示法获得所有这些键的联合。
例如,对于这个配置:
type Config = {
initial: string;
states: {
idle: {
on: {
START: string;
};
};
running: {
on: {
PAUSE: string;
};
};
paused: {
initial: string;
states: {
frozen: {
on: {
HEAT: string;
};
};
};
on: {
RESET: string;
};
};
};
我想要 'idle' | 'running' | 'paused' | 'paused.frozen'
这可能吗?有任何想法吗?
回答
看起来像是递归条件类型和模板文字类型的另一项工作:
type StatesKeys<T> = T extends { states: infer S } ? {
[K in Extract<keyof S, string>]: K | `${K}.${StatesKeys<S[K]>}`
}[Extract<keyof S, string>] : never
type ConfigStatesKeys = StatesKeys<Config>;
// type ConfigStatesKeys = "idle" | "running" | "paused" | "paused.frozen"
StatesKeys<T>检查T它的states属性S,并为它的每个键生成K我们想要的联合,即它K本身,加上可能K与点和 的连接StatesKeys<S[K]>>。也就是说,我们将每个键K与来自 的任何嵌套键连接起来S[K]。如果没有嵌套键,并且StatesKeys<S[K]>is never,则模板文字也将变为never,因此我们不必对其进行特殊处理。
Playground 链接到代码