我遇到了这个打字挑战MyReadonly2.以下是我最初的解决方案:
// doesn't work as `Exclude` could potentially change the existing `readonly` modifier in the object
type MyReadonly2<T, K extends keyof T = keyof T> = { [P in Exclude<keyof T, K>]: T[P] } & { readonly [P in K]: T[P] }
以下是正确答案之一:
type MyReadonly2<T, K extends keyof T = keyof T> = Omit<T, K> & { readonly [P in K]: T[P] }
这两种方法基本上有相同的 idea ,但我如何确保在复制对象成员时不会更改对象的只读修饰符?与Omit
的唯一区别是对K:的类型约束:
type Omit<T, K extends string | number | symbol> = { [P in Exclude<keyof T, K>]: T[P]; }
为什么会有不同呢?