首页 > 解决方案 > 尝试将多个 keyof 分配给 Typescript 中的动态描述对象

问题描述

这是一个工作示例来说明我的问题。


interface Definition {
  oneTitle: string
  oneDescription: string
  twoTitle: string
  twoDescription: string
}

const obj = {
  oneTitle: 'Title 1',
  oneDescription: 'Desc 1',
  twoTitle: 'Title 2',
  twoDescription: 'Desc 2'
}

type Keys = 'one' | 'two'

const keys: Keys[] = [
  'one',
  'two'
]

keys.forEach((key) => {
  const {
    [`${key}Title` as keyof Definition]: title,
    [`${key}Description` as keyof Definition]: description,
  } = obj
})

如您所见,有一个动态对象分解,例如。[`${key}Title`]. 我想知道在这种情况下,Typescript 中是否有一种方法可以避免as keyof Definition为每个键定义多次?

我尝试了以下事情但没有成功。

const {
  [`${key}Title`]: title,
  [`${key}Description`]: description,
}: Record<keyof Definition, Definition> = config
const {
  [`${key}Title`]: title,
  [`${key}Description`]: description,
}: {[key in keyof Definition]: Definition} = config

事实上,当我在这两种情况下都遇到这个错误时has no matching index signature for type 'string,Typescript 似乎将动态键解释为字符串而不是定义类型的 keyof。

谢谢你的帮助 (:

标签: typescripttypescript-typings

解决方案


这不是一个巨大的改进,但如果您在 2 个地方阻止自动类型扩大,您可以删除对 的需要as keyof Definition,尽管代码仍然会有点重复。声明keys数组as const,使其不会扩大到string[],并声明属性访问器as const,使其也不会扩大到string

const keys = [
  'one',
  'two'
] as const;

keys.forEach((key) => {
  const {
    [`${key}Title` as const]: title,
    [`${key}Description` as const]: description,
  } = obj
})

推荐阅读