MST

星途 面试题库

面试题:深度剖析TypeScript中Partial工具类型的源码并扩展

请详细解释TypeScript中`Partial`工具类型的源码实现原理(源码大概为`type Partial<T> = { [P in keyof T]?: T[P]; }`)。基于此,实现一个`DeepPartial`工具类型,它不仅能使对象的顶级属性可选,还能递归地使对象嵌套结构中的所有属性都变为可选,例如: ```typescript interface Address { street: string; city: string; } interface User { name: string; age: number; address: Address; } ``` 使用`DeepPartial<User>`应该使`name`、`age`和`address`以及`address`中的`street`和`city`都变为可选。
40.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

Partial工具类型的源码实现原理

type Partial<T> = { [P in keyof T]?: T[P]; }。这段代码定义了一个名为Partial的类型别名,作用是将类型T的所有属性都变为可选属性。具体原理如下:

  1. keyof T:获取类型T的所有键的联合类型。例如,如果T{a: number, b: string},那么keyof T就是"a" | "b"
  2. [P in keyof T]:这是一个映射类型,P会依次遍历keyof T中的每一个键。
  3. ?: T[P]:这里的?表示将属性变为可选,T[P]表示属性P在类型T中的值类型。所以,整体就是将类型T的每一个属性都变为可选属性。

DeepPartial工具类型的实现

type DeepPartial<T> = {
    [P in keyof T]?: T[P] extends object
      ? DeepPartial<T[P]>
       : T[P];
};

在上述代码中:

  1. 同样使用[P in keyof T]遍历类型T的所有键。
  2. 使用条件类型T[P] extends object判断属性值是否为对象类型。
  3. 如果是对象类型,则递归调用DeepPartial使其所有属性也变为可选;如果不是对象类型,则保持原类型不变。这样就实现了递归地使对象嵌套结构中的所有属性都变为可选。

例如,对于上述定义的UserAddress接口,DeepPartial<User>会使nameageaddress以及address中的streetcity都变为可选。