MST

星途 面试题库

面试题:TypeScript泛型工具类型Pick、Omit和Exclude的组合应用

给定一个接口FullProduct,包含id、name、description、price、category等多个字段。现在要求创建两个新类型:一个是只包含id、name和price字段的类型;另一个是除了category字段之外的其他所有字段的类型。请使用Pick、Omit和Exclude泛型工具类型来实现,并说明这几个工具类型在组合使用时的相互关系和注意事项。
22.1万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 只包含 idnameprice 字段的类型:
interface FullProduct {
    id: string;
    name: string;
    description: string;
    price: number;
    category: string;
}

type ProductSummary = Pick<FullProduct, 'id' | 'name' | 'price'>;
  1. 除了 category 字段之外的其他所有字段的类型:
type ProductWithoutCategory = Omit<FullProduct, 'category'>;

Pick、Omit 和 Exclude 泛型工具类型的相互关系和注意事项

  • 相互关系
    • Pick<T, K>:从类型 T 中选择一组属性 K 来构造新类型。
    • Omit<T, K>:从类型 T 中移除一组属性 K 来构造新类型。可以认为 Omit<T, K> 等价于 Pick<T, Exclude<keyof T, K>>Exclude 在这里先计算出要移除属性后的剩余属性。
    • Exclude<T, U>:从联合类型 T 中排除所有可分配给 U 的类型,返回一个新的联合类型。在 Omit 实现中,Exclude<keyof T, K> 就是计算出 T 类型中除去 K 这组属性名后的其他属性名。
  • 注意事项
    • 属性名类型PickOmit 的第二个参数必须是类型 T 中属性名的联合类型。如果传入不存在的属性名,TypeScript 会在编译时报错。例如,Pick<FullProduct, 'nonExistentProperty'> 会报错。
    • 类型兼容性:使用这些工具类型构造出的新类型与原类型是不同的类型,尽管它们可能部分属性相同。在进行类型赋值和函数参数传递时,要确保类型兼容性。例如,一个函数接受 FullProduct 类型参数,传入 ProductSummary 类型参数会报错,因为 ProductSummary 缺少 FullProduct 中的一些属性。
    • 复杂类型嵌套:当原类型 T 中存在复杂类型嵌套时,这些工具类型只作用于最外层属性。如果需要对嵌套类型内部属性进行操作,可能需要递归地使用这些工具类型或者自定义泛型来处理。