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)」撰写