typescript - 尝试将多个 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。
谢谢你的帮助 (:
解决方案
这不是一个巨大的改进,但如果您在 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
})
推荐阅读
- python - 为什么回溯打印早于打印网址?
- ios - 使用日期键对字典数组进行排序
- ansible - 如何从其他文件调用 ansible yml 文件?
- mobx - 使 React 展示组件对 MobX 存储更改做出反应的任何方式
- mongodb - 首次启动 MongoDB 时出现问题 (MAC)
- python - python 中的“yield”关键字是如何真正起作用的,尤其是当它带有递归时?
- java - java.io.IOException:服务器返回 HTTP 响应代码:500 for URL:“SoapEndPoint url”
- sql - 如何在这个给定的场景中获取非翻译数据
- database - Azure Cosmos DB 中的行级安全性
- makefile - 即使使用 -I 标志,makefile 也找不到包含文件路径