typescript 我想获取对象的里面name值的联合类型要怎么处理

顺子,要不起
  • 1
新手上路,请多包涵
const aa = {
  action: [
    {
      name: 'a',
      c: '1'
    },
    {
      name: 'b',
      c: '1'
    }
  ],
  inject: [
    {
      name: 'c',
      c: '1'
    },
    {
      name: 'd',
      c: '1'
    }
  ]
}

// interface P {
//   name: string
//   [props: string]: any
// }

type GetName<Item extends any> = Item extends {name: infer V} ? V : never;
type EachArr<Head extends any, Rest extends any[]> = [Head, ...Rest]

type GetArrUnions<Arr extends any[]> =
  Arr extends [] ? ''
  : Arr extends EachArr<infer F, []> ? GetName<F>
  : Arr extends EachArr<infer F, infer R> ? GetName<F> | GetArrUnions<R>
  : never

type GetObjectUnions<O extends Record<any, any>> = {
  [K in keyof O]: GetArrUnions<O[K]>
}[keyof O]

type U = GetObjectUnions<typeof aa>

我想获取 U 类型为 abcd 的联合类型,但是目前实现的是 neve r类型,我找到问题原因是因为 O[K] 这里导致的,不知道怎么处理

回复
阅读 391
1 个回答
const aa = {
  action: [
    {
      name: 'a',
      c: '1'
    },
    {
      name: 'b',
      c: '1'
    }
  ],
  inject: [
    {
      name: 'c',
      c: '1'
    },
    {
      name: 'd',
      c: '1'
    }
  ]
} as const

type M = (typeof aa)['action' | 'inject'][number]['name']
宣传栏