Open
Description
题目
题目链接:MyReadonly
实现 Readonly
使得属性变为可读。
当尝试修改 title
和 description
会报错
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 extends {}> = { readonly [key in keyof T]: T[key] };
知识点
- 使用
keyof
将T
中的属性变成联合类型 - 使用
in
遍历联合类型 - 最后用
readonly
去修饰每一个key
方法二
type MyReadonly<T, K extends keyof T = keyof T> = {
readonly [key in K]: T[key];
};
知识点
这里做了两次约束
- 第一个约束是
K extends keyof T
,K
是T
属性的联合类型 - 第二个约束是
= keyof T
,如果没有为该类型指定类型参数,默认使用keyof T