题目
不要使用内置的Readonly
该 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
单元测试
import { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<MyReadonly<Todo1>, Readonly<Todo1>>>,
]
interface Todo1 {
title: string
description: string
completed: boolean
meta: {
author: string
}
}
通过 JS 解题
function readonly () {
const result = {};
for (const key in obj) {
result['readonly_' + key] = obj[key]; // 通过 key 前缀 readonly_ 模拟只读设置操作
}
return result;
}
知识点
- 返回一个对象
- 遍历 obj(JS 对象,TS 接口)
- 加上 readonly 关键字
-
翻译为 TS
type MyReadonly<T> = { readonly [P in keyof T] : T[P]; };
返回一个对象
- 遍历 obj(JS 对象,TS 接口)
- in -> mapped key of -> lookup
- 加上 readonly 关键字
- readonly
- 通过 key 来获取 obj(接口)里面的值
- indexed