【问题标题】:Trying to assign multiple keyof to a dynamic desctured object in Typescript尝试将多个 keyof 分配给 Typescript 中的动态描述对象
【发布时间】:2021-08-28 01:18:43
【问题描述】:

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


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。

感谢您的帮助(:

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案1】:

    这不是一个巨大的改进,但如果你在 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
    })
    

    【讨论】:

    • 我记得在 TS github 上看到了一个备受争议的问题,即可能添加一个选项来禁用所有地方的类型扩展 - 尚未实现 AFAIK,但它对于我们现在看到的更多功能样式很有用,会让所有这些都变得不必要,但在搜索了一下之后我无法再次找到它的链接。
    • 感谢您的回复。我不认为它真的适合这种情况,我想找到一种方法而不为每个键定义类型。
    • 我认为目前无法缩短事情的时间,但我可能错了。但是,TypeScript 通常在动态键方面存在问题,使代码更加复杂。如果可能的话,我强烈建议您更改数据结构,以便键不是动态的。
    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 2017-12-07
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2012-10-18
    • 2015-08-20
    • 2017-08-08
    相关资源
    最近更新 更多