teknik2008
@teknik2008
Расскажите про GOLANG. Мне интересно

Как в typescript объединить ключи, и если появляются повторы, то сделать объединение типов?

Нужно из R преобразовать в Result дженериком. Будет идеально, если решение будет поддерживать глубину более 4.

type A = {
  i: boolean;
  o: void;
};

type B = {
  i: string;
  o: number;
};

type R = {
  A: A;
  B: B;
};


Получить тип

type Result = {
  'A.i': boolean;
  'A.o': void;
  'B.i': string;
  'B.o': number;
  // ключи выше я могу получить, но звездочки не погу решить. 
  '*.i': string | boolean;
  '*.o': void | number;
  'A.*': boolean | void;
  'B.*': string | number;
  '*.*': boolean | void | number | string;
}
  • Вопрос задан
  • 317 просмотров
Пригласить эксперта
Ответы на вопрос 2
Alexandroppolus
@Alexandroppolus
кодир
Запилил такой вариант.

Поддерживаются вложенные объекты и массивы (кортежи), см. пример. Глубина рекурсии произвольная, но результат получается здоровенный, если много всего.

Решение влоб: сначала находим все пути до простых значений, потом по множеству этих путей собираем объект.
Ответ написан
WblCHA
@WblCHA
Решение за один проход с поддержкой массивов и таплов. Глубина любая.

https://www.typescriptlang.org/play/?#code/C4TwDgp...

Основное отличие от решения Alexandroppolus, ключи собираются последовательно и не парсятся, но результат, понятное дело, одинаковый.

type JoinKeys<T extends object> = JoinKeysDeep<T> extends infer J extends Record<
  string,
  unknown
>
  ? { [Key in J extends J ? keyof J : never]: J extends J ? J[Key] : never }
  : never;

type JoinKeysDeep<
  T extends object,
  K extends keyof T = JoinKeysDeep.GetKeys<T> & keyof T,
> = K extends K & (string | number)
  ? T[K] extends object
    ? JoinKeysDeep<T[K]> extends infer J extends Record<string, unknown>
      ? J extends J
        ? Record<`${K | '*'}.${keyof J & (string | number)}`, J[keyof J]>
        : never
      : never
    : Record<K | '*', T[K]>
  : never;
namespace JoinKeysDeep {
  export type GetKeys<T> = T extends unknown[]
    ? keyof T &
        (number extends T['length']
          ? // array
            number
          : // tuple
            `${number}`)
    : keyof T;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы