TypeScript 类型体操-给 Lodash _.get 写参数类型

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

在线体验 (opens new window)

Img

本文由「Yank Note - 一款面向程序员的 Markdown 笔记应用 (opens new window)」撰写