ts 如何生成数组对象指定 key 的类型?

数组对象的 key 的类型

有一个数组如下:

const list = [
    {
        key: '001',
        value: 'xxx',
    },
    {
        key: '002',
        value: 'xxx'
    },
    {
        key: '003',
        value: 'xxx'
    },
    // ...
]

如何生成一个联合类型 Keys:

type Keys = '001' | '002' | '003' | ...

对象的 key 的类型

有一个对象如下:

const obj = {
  '001': {
    label: '001',
    value: 'xxx',
  },
  '002': {
    label: '002',
    value: 'xxx'
  },
  '003': {
    label: '002',
    value: 'xxx'
  },
  // ...
}

如何生成一个联合类型 Keys:

type Keys = '001' | '002' | '003' | ...

根据 @kkopite 的回复,可以这样做:

const obj = {
  '001': {
    label: '001',
    value: 'xxx',
  },
  '002': {
    label: '002',
    value: 'xxx'
  },
  '003': {
    label: '002',
    value: 'xxx'
  },
  // ...
} as const

type P = keyof typeof obj

image.png

如果给 obj 声明一个类型:

type Obj = {
  [key: string]: {
    label: string
    value: string
  }
}

const obj: Obj = {
  '001': {
    label: '001',
    value: 'xxx',
  },
  '002': {
    label: '002',
    value: 'xxx'
  },
  '003': {
    label: '002',
    value: 'xxx'
  },
  // ...
} as const

type P = keyof typeof obj

推导将会失效:

image.png

请问如何解决呢?

阅读 5.4k
1 个回答
const list = [
  {
      key: '001',
      value: 'xxx',
  },
  {
      key: '002',
      value: 'xxx'
  },
  {
      key: '003',
      value: 'xxx'
  },
  // ...
] as const

type Keys = typeof list[number]['key']

你已经指定了obj的类型为Obj,此时keyof typeof obj就是等价于keyof Obj了,这种情况可以通过定义一个函数加上泛型来解决:

type Obj = {
  [key: string]: {
    label: string
    value: string
  }
}

function d<T extends Obj>(obj: T) {
  return obj
}

const obj = d({
  '001': {
    label: '001',
    value: 'xxx',
  },
  '002': {
    label: '002',
    value: 'xxx'
  },
  '003': {
    label: '002',
    value: 'xxx'
  },
  '3': {
    label: '11',
    value: '112'
  }
  // ...
})

type P = keyof typeof obj

推荐问题
logo
Microsoft
子站问答
访问
宣传栏