题目描述 🎯
实现Omit<T, K>类型,从类型T中剔除K中指定的属性。
题目分析 📝
// 期望结果示例:
interface Todo {
title: string;
description: string;
completed: boolean;
}
type TodoPreview = Omit<Todo, 'description'>
// 结果:{ title: string; completed: boolean; }
解题思路 💡
- 使用映射类型直接构建新的类型。
- 使用
as过滤不需要的属性。 - 保留原属性的类型信息。
代码实现 ⌨️
type MyOmit<T, K extends keyof any> = {
[P in keyof T as P extends K ? never : P]: T[P]
}
解题详解
- 类型参数解析
K extends keyof any // 是一个类型约束,K 必须是可以作为对象属性的合法键类型,keyof any的结果为 string | number | symbol 。
- 实现步骤解析
// 步骤1:遍历原类型的所有属性
[P in keyof T]
// 步骤2:使用条件类型过滤属性
P extends K ? never : P
// 步骤3:保留原属性类型
T[P]
- 测试示例分析
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; }