来自嵌套对象的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 链接到代码


以上是来自嵌套对象的TypeScript模板文字字符串的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>