Readonly
问题描述
不要使用内置的Readonly<T>,自己实现一个。
泛型 Readonly<T> 会接收一个 泛型参数,并返回一个完全一样的类型,只是所有属性都会是只读 (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
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
type cases = [Expect<Equal<MyReadonly<Todo1>, Readonly<Todo1>>>]
interface Todo1 {
title: string
description: string
completed: boolean
meta: {
author: string
}
}
// ============= Your Code Here =============
// 答案
type MyReadonly<T> = {
readonly [P in keyof T]: T[P]
}
readonly 的含义为,将该属性设置为只读属性,即不可修改,这里 Equal<MyReadonly<Todo1>, Readonly<Todo1>> 是将我们自己写的类型和内置的 readonly 类型做比较,判断二者是不是相同类型。这里只接受一个泛型参数,则传递的应该是类型,而 key 值应该为该类型上的属性 即 [P in keyof T],那么 T[P] 即为键值。在属性前加上关键字 readonly 即可。