typescript - 如何递归地获取嵌套对象的所有键?
问题描述
type NestedObject = {
amount: number,
error: string | null,
data: {
rows: [],
messages: {
goodNews: string | null,
badNews: string | null
}
}
}
//trying recursively get all keys
type AllKeys<T, K extends keyof T> =
T extends object ?
T extends infer O ?
{keys: K | AllKeys<O, keyof O> : never
: K
type Test = AllKeys<NestedObject, keyof NestedObject>
结果我有:
type Test = { keys: 'amount' | 'error' | 'data' | ... }
但我需要得到:
type Test = { keys: 'amount' | 'error' | 'data' | 'rows' | 'messages' | 'goodNews' | 'badNews'}
解决方案
看起来你想要这样的东西:
type RecursiveKeyof<T> = T extends object ? (
T extends readonly any[] ? RecursiveKeyof<T[number]> : (
keyof T | RecursiveKeyof<T[keyof T]>
)
) : never
这会递归到对象类型,为您提供所有子属性和子子属性等的键。它忽略原语(所以 no keyof string
)和特殊情况数组,因此您只能获取数组元素的键,而不是数组本身(具有number
和"push"
、、"pop"
等键)。
你AllKeys
似乎想要一个keys
属性,所以我们可以这样写:
type AllKeys<T> = { keys: RecursiveKeyof<T> }
让我们看看它是否有效:
type Test = AllKeys<NestedObject>
// type Test = {keys: "amount" | "error" | "data" | "rows" | "messages" | "goodNews" | "badNews" }
看起来挺好的。
推荐阅读
- angular - 如何在 Angular 7 中创建可选的路由器参数
- javascript - 查询包含长度> 0数组的文档的firebase
- hyperledger-fabric - Hyperledger Fabric:恐慌:运行时错误:fabric/peer/common.NewPeerClientForAddress 处的内存地址无效或 nil 指针取消引用
- sql-server - 没有从新存储过程创建的复杂类型,EF 数据库优先
- mysql - 从相关表中一次选择多项选择计数()
- python - 同一图像的 2 个灰度图像有何不同?
- twitter-bootstrap - Bootstrap Accordion 升级后损坏
- python - Python:A类创建B和C类的实例,B和C如何调用A中的函数或相互调用?
- r - 匹配数据框中的数值
- sapui5 - 未捕获的 TypeError:Fragment.load 不是函数