面试题答案
一键面试Partial
工具类型的源码实现原理
type Partial<T> = { [P in keyof T]?: T[P]; }
。这段代码定义了一个名为Partial
的类型别名,作用是将类型T
的所有属性都变为可选属性。具体原理如下:
keyof T
:获取类型T
的所有键的联合类型。例如,如果T
是{a: number, b: string}
,那么keyof T
就是"a" | "b"
。[P in keyof T]
:这是一个映射类型,P
会依次遍历keyof T
中的每一个键。?: T[P]
:这里的?
表示将属性变为可选,T[P]
表示属性P
在类型T
中的值类型。所以,整体就是将类型T
的每一个属性都变为可选属性。
DeepPartial
工具类型的实现
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object
? DeepPartial<T[P]>
: T[P];
};
在上述代码中:
- 同样使用
[P in keyof T]
遍历类型T
的所有键。 - 使用条件类型
T[P] extends object
判断属性值是否为对象类型。 - 如果是对象类型,则递归调用
DeepPartial
使其所有属性也变为可选;如果不是对象类型,则保持原类型不变。这样就实现了递归地使对象嵌套结构中的所有属性都变为可选。
例如,对于上述定义的User
和Address
接口,DeepPartial<User>
会使name
、age
、address
以及address
中的street
和city
都变为可选。