Lodash 的 _.get
(opens new window) 方法可以使用路径字符串从一个对象中取值。现在我们想给这个路径参数做上类型限制。
这里只展示核心类型,用运算递归来实现。
type Flat<T extends Record<string, any>, P extends string = ''> =(
{
[K in keyof T as (
T[K] extends string
? (K extends string ? (P extends '' ? K : `${P}.${K}`) : never)
: (K extends string ? keyof Flat<T[K], P extends '' ? K : `${P}.${K}`> : never)
)]: never
}
)
const obj = {
a: {
b: {
c: '1',
d: '1',
},
e: '1',
},
f: '1',
}
type ObjType = typeof obj
type Path = keyof Flat<ObjType>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
本文由「Yank Note - 一款面向程序员的 Markdown 笔记应用 (opens new window)」撰写