MST

星途 面试题库

面试题:TypeScript中Required工具类型的自定义实现与原理分析

请自行实现一个类似Required的工具类型MyRequired,它接收一个类型参数T,返回一个新类型,使得T中的所有属性都变为必填。并详细解释实现过程中涉及到的类型系统原理,以及与内置Required工具类型相比,你的实现有哪些优势和局限性。
39.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现MyRequired工具类型

type MyRequired<T> = {
    [P in keyof T]-?: T[P];
};

实现过程中涉及的类型系统原理

  1. 索引类型查询keyof T 用于获取类型 T 的所有键的联合类型。例如,如果 T{ a: number; b: string },那么 keyof T 就是 "a" | "b"
  2. 映射类型[P in keyof T] 表示对 T 中的每个键 P 进行迭代。在这个迭代过程中,我们可以对每个属性进行转换。
  3. 属性修饰符-? 用于移除属性的可选修饰符 ?。当属性定义为 prop?: string 时,使用 -? 可以将其变为 prop: string,即必填属性。

与内置Required工具类型相比

  • 优势:实现简单直接,清晰展示了将属性变为必填的核心逻辑,有助于理解类型系统的基础原理。对于初学者来说,通过阅读这个自定义实现更容易明白 Required 工具类型的工作方式。
  • 局限性
    • 性能:内置的 Required 工具类型经过了TypeScript编译器的优化,在实际应用中可能具有更好的性能,尤其是在处理复杂类型时。
    • 功能完整性:内置的 Required 工具类型可能在处理一些极端或特殊类型情况时更加健壮和全面,因为它是TypeScript官方实现并经过大量测试的,而自定义的 MyRequired 可能存在一些未考虑到的边界情况。