不使用 Omit
实现 TypeScript 的 Omit<T, K>
泛型
Omit
会创建一个省略 K
中字段的 T
对象
例如:
interface Todo {
title: string
description: string
completed: boolean
}
type TodoPreview = MyOmit<Todo, 'description' | 'title'>
const todo: TodoPreview = {
completed: false,
}
答案
type MyOmit<T, P extends keyof T> = { [K in keyof T as K extends P ? never: K]: T[K] }
而不是:
type MyOmit<T, P extends keyof T> = { [K in Exclude<keyof T, P>]: T[K] }
这样会导致
readonly
修饰符丢失,通不过以下测试:interface Todo1 { readonly title: string description: string completed: boolean } Expect<Equal<Expected3, MyOmit<Todo1, 'description' | 'completed'>>>