实现Omit

79 阅读1分钟

题目描述 🎯

实现Omit<T, K>类型,从类型T中剔除K中指定的属性。

题目分析 📝

// 期望结果示例:
interface Todo {
  title: string;
  description: string;
  completed: boolean;
}

type TodoPreview = Omit<Todo, 'description'>
// 结果:{ title: string; completed: boolean; }

解题思路 💡

  1. 使用映射类型直接构建新的类型。
  2. 使用as过滤不需要的属性。
  3. 保留原属性的类型信息。

代码实现 ⌨️

type MyOmit<T, K extends keyof any> = {
  [P in keyof T as P extends K ? never : P]: T[P]
}

解题详解

  1. 类型参数解析
K extends keyof any // 是一个类型约束,K 必须是可以作为对象属性的合法键类型,keyof any的结果为 string | number | symbol 。
  1. 实现步骤解析
// 步骤1:遍历原类型的所有属性
[P in keyof T]

// 步骤2:使用条件类型过滤属性
P extends K ? never : P

// 步骤3:保留原属性类型
T[P]
  1. 测试示例分析
type MyOmit<T, K extends keyof any> = {
  [P in keyof T as P extends K ? never : P]: T[P]
}
// 测试1:单个属性
interface Person {
  name: string;
  age: number;
  address: string;
}
type Test1 = MyOmit<Person, 'age'>;
// 结果: { name: string; address: string; }

// 测试2:多个属性
type Test2 = MyOmit<Person, 'name' | 'address'>;
// 结果: { age: number; }

// 测试3:不存在的属性
type Test3 = MyOmit<Person, 'notExist'>;
// 结果: { name: string; age: number; address: string; }