问题 #
不要使用内置的Readonly<T>
,自己实现一个。
该 Readonly
会接收一个 泛型参数,并返回一个完全一样的类型,只是所有属性都会被 readonly
所修饰。
也就是不可以再对该对象的属性赋值。
例如:
interface Todo {
title: string
description: string
}
const todo: MyReadonly<Todo> = {
title: 'Hey',
description: 'foobar'
}
todo.title = 'Hello' // Error: cannot reassign a readonly property
todo.description = 'barFoo' // Error: cannot reassign a readonly property
解答 #
type MyReadonly<T> = { readonly [K in keyof T]: T[K] }
拆分 #
- 和 实现 Pick 相似
keyof T
是"title" | "description"
用来限制T
的范围 K in
逐个拿取"title" | "description"
通过索引对象包装- 返回包装后的对象
- 这个并没有递归处理所以是属于浅只读