面试题答案
一键面试实现MyRequired工具类型
type MyRequired<T> = {
[P in keyof T]-?: T[P];
};
实现过程中涉及的类型系统原理
- 索引类型查询:
keyof T
用于获取类型T
的所有键的联合类型。例如,如果T
是{ a: number; b: string }
,那么keyof T
就是"a" | "b"
。 - 映射类型:
[P in keyof T]
表示对T
中的每个键P
进行迭代。在这个迭代过程中,我们可以对每个属性进行转换。 - 属性修饰符:
-?
用于移除属性的可选修饰符?
。当属性定义为prop?: string
时,使用-?
可以将其变为prop: string
,即必填属性。
与内置Required工具类型相比
- 优势:实现简单直接,清晰展示了将属性变为必填的核心逻辑,有助于理解类型系统的基础原理。对于初学者来说,通过阅读这个自定义实现更容易明白
Required
工具类型的工作方式。 - 局限性:
- 性能:内置的
Required
工具类型经过了TypeScript编译器的优化,在实际应用中可能具有更好的性能,尤其是在处理复杂类型时。 - 功能完整性:内置的
Required
工具类型可能在处理一些极端或特殊类型情况时更加健壮和全面,因为它是TypeScript官方实现并经过大量测试的,而自定义的MyRequired
可能存在一些未考虑到的边界情况。
- 性能:内置的