Рекурсивно разворачивать тип объекта в TypeScript

#typescript #typescript-generics

#typescript #typescript-дженерики

Вопрос:

Я хочу развернуть некоторые типы в TypeScript, вот пример:

     // previously defined Type<T>

    // example of wrapped type:
    type Wrapped = Type<{
      a: Type<boolean>,
      b: Type<{
        c: Type<number>
      }>
    }>

    type Unwrap = ...// this needs to be defined

    //And its usage like:
    type Unwrapped1 = Unwrap<Wrapped>// should be: { a: boolean, b: { c: number } }
    type Unwrapped2 = Unwrap<Type<string>>// should be: string
    .
    .
    .
  

Как можно определить разворачивание?

Ответ №1:

Для развертывания типа можно использовать сопоставленные и условные типы, а также сопоставленные типы:

 type UnwrapObject<T> = {
  [P in keyof T] : Unwrap<T[P]>
}
type Unwrap<T> =  T extends Type<infer U> ? 
  U extends object ? UnwrapObject<U> : U: 
  T extends object ? UnwrapObject<T> : T

//And its usage like:
type Unwrapped1 = Unwrap<Wrapped>// should be: { a: boolean, b: { c: number } }
type Unwrapped2 = Unwrap<Type<string>>// should be: string

declare let d: Unwrapped1;
d.b.c // number

  

Ссылка на игровую площадку