Преобразование ключей типа в объединение с необязательными параметрами

Есть ли способ преобразовать тип Screens в тип ScreensNew?

Что я хочу сделать, так это:

  • Преобразовать все ключи первого уровня в строки (например, keyof)
  • Оставьте остальные параметры как есть (уберите undefined)
  • Затем создайте тип объединения каждого свойства
type Screens = {
  First: undefined;
  Second: {
    name: string;
  }
}
type ScreensNew =
  | "First"
  | "Second": { name: string; }
}

person uloco    schedule 08.06.2020    source источник
comment
Ваш желаемый тип не является допустимым типом Ts. Вы имеете в виду что-то вроде type ScreensNew = | { type: "First" } | { type: "Second", name: string; }   -  person Titian Cernicova-Dragomir    schedule 08.06.2020


Ответы (1)


Тип в вашем сообщении не является допустимым типом TS. Мы можем создать размеченное объединение вида type ScreensNew = | { type: "First" } | { type: "Second", name: string; }:

type Screens = {
  First: undefined;
  Second: {
    name: string;
  }
}

type CreateDiscriminatedProps<T> = T extends undefined ? {} : T
type CreateDiscriminated<T> = {
  [P in keyof T]: { type: P } & CreateDiscriminatedProps<T[P]>
}

type ScreensNew = CreateDiscriminated<Screens>

//Same as
// type ScreensNew = {
//     First: {
//         type: "First";
//     };
//     Second: {
//         type: "Second";
//     } & {
//         name: string;
//     };
// }

Playground Link

person Titian Cernicova-Dragomir    schedule 08.06.2020
comment
О да, вы абсолютно правы. Полностью пропустил, что это недопустимый тип. Но ваш ответ, тем не менее, полезен. Спасибо :) - person uloco; 08.06.2020