尝试为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
})