Typescript类型拼合子嵌套对象

z9ju0rcb  于 2022-11-18  发布在  TypeScript
关注(0)|答案(1)|浏览(117)

我一直在遵循这个例子和here来扁平化一个类型invain。大多数这样的扁平化对象完全删除嵌套。我想保持我的结构,只是删除嵌套对象中的一些 Package 器(在这个例子中是body),这些对象可以是任何东西和n层。
我想将我的类型从

type TestInterface {
  id: string
  body: {
    title: string 
    something: string 
    user: {
      id: string
      body: {
        firstname: string
        lastname: string
        age: number
      }
    }
    country: {
      id: string
      body: {
        code: string
        name: string
        region: {
          id: string
          body: {
            code: string
            name: string
            continent: {
              id: string
              body: {
               code: string
               name: string
              }
            }
          }
        }
      }
    }
  }
}

所需的输出与上面的类型结构相同,但删除了主体 Package 。

type TestInterface {
  id: string
  title: string 
  something: string 
  user: {
    id: string
    firstname: string
    lastname: string
    age: number
  }
  country: {
    id: string
    code: string
    name: string
    region: {
      id: string
      code: string
      name: string
      continent: {
        id: string
        code: string
        name: string
      }
    }
  }
}
xxslljrj

xxslljrj1#

type Pure<T> = T extends object ? {[K in keyof T]: T[K]} : T
type Flatten<T> = Pure<
| T extends {body: any} ? Flatten2<Omit<T, 'body'> & T['body']> : Flatten2<T>
>
type Flatten2<T> = T extends object ? {[K in keyof T]: Flatten<T[K]>} : T

type X = Flatten<TestInterface>

Playground

相关问题