尝试为Typescript中的动态描述对象分配多个keyof

尝试为Typescript中的动态描述对象分配多个keyof,typescript,typescript-typings,Typescript,Typescript Typings,这里有一个工作示例来说明我的问题 interface Definition { oneTitle: string oneDescription: string twoTitle: string twoDescription: string } const obj = { oneTitle: 'Title 1', oneDescription: 'Desc 1', twoTitle: 'Title 2', twoDescription: 'Desc 2' }

这里有一个工作示例来说明我的问题


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中是否有一种方法可以避免将多次
定义为每个键的keyof Definition

我试过以下几件事,但都没有成功

const {
  [`${key}Title`]: title,
  [`${key}Description`]: description,
}: Record<keyof Definition, Definition> = config
事实上,由于我在这两种情况下都遇到了错误,
没有与类型“string
匹配的索引签名,因此似乎Typescript将动态键解释为字符串,而不是定义类型的键


感谢您的帮助(:

这并不是一个很大的改进,但是如果您在两个位置阻止自动类型加宽,您可以删除
作为定义键的需要,尽管代码仍然有点重复。将
键声明为常量
数组
,这样它就不会加宽到
字符串[]
,并将属性访问器
声明为const
,这样它也不会扩展到
字符串

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

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

我记得在TS github上看到了一个激烈争论的问题,关于是否可能添加一个选项来禁用随处可见的类型加宽-目前还没有实现,但它对我们现在看到的更多功能样式很有用,这会使所有这些都变得不必要,但我在搜索了一点之后,再也找不到它的链接。谢谢你的回复。我不知道我不认为它真的适合这种情况,我想找到一种不为每个键定义类型的方法。我不认为现在可以缩短时间,但我可能错了。但是,TypeScript通常与动态键有关,使代码更加复杂。我强烈建议改为更改数据结构,以便如果可能的话,关键点不是动态的。
const keys = [
  'one',
  'two'
] as const;

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