type MyReadonly
Solution by amirdaGankhuyag #37514
type MyReadonly<T> = {
readonly [K in keyof T]: T[K]
}
Solution by Lemoneey #37494
// first thing i did was
type MyReadonly<Type> = Readonly<Type>
// then this is my custom
type MyReadonly<Type> = {
readonly [Key in keyof Type]: T[Key];
};
Solution by Muntazir-sd #37428
type MyReadonly<T> = {
readonly [P in keyof T]: T[P]
}
<T>
T
represents the type you want to make readonly (the whole interface).[P in keyof T]
T
.P
inside keyof T
, a corresponding property will be created in the resulting type.readonly
modifier
T[P]
P
, this looks up its property type from T
.P = "completed"
and T = Todo
, then T[P] = boolean
.MyReadonly<T>
constructs a new type by:
T
.Solution by 3aluw #37420
type MyReadonly<T> = {
readonly [P in keyof T] : T[P]
}
// 有约束的 Pick - 安全 type SafePick<T, K extends keyof T> = { [P in K]: T[P]; // ✅ 安全:P 一定是 T 的键 };
// 无约束的 Pick - 危险(实际上无法这样写)
type UnsafePick<T, K> = {
[P in K]: T[P]; // ❌ P 可能不是 T 的键
};
K extends keyof T
- 约束 K 只能是 T 的键的联合类型
// ? 修饰符
interface User {
name: string;
phone?: string; // 可选属性
}
// Partial<T> 工具类型
type PartialUser = Partial<User>;
// 等价于:{ name?: string; phone?: string }
// -? 移除可选性(在工具类型中使用)
type Required<T> = {
[P in keyof T]-?: T[P];
}
interface User {
name: string;
phone?: string;
}
type RequiredUser = Required<User>;
// 等价于:{ name: string; phone: string }
// 只读且可选
type ReadonlyPartial<T> = Readonly<Partial<T>>;
// 移除了只读但保持可选
type MutablePartial<T> = {
-readonly [P in keyof T]?: T[P];
}
// 你的答案
Solution by nyk233233 #37414
// 你的答案
/**
* @description
* [K in keyof T] - keyof取出T中的所有键后,使用in遍历这个联合类型
* T[K] - 获得T中的每一个键对应的类型
* readonly - 添加readonly关键字,使每一项变为只读
*/
type MyReadonly<T> = {
readonly [K in keyof T]: T[K]
}
Solution by lToBContinued #37408
type MyReadonly<T> = {
readonly [k in keyof T]: T[k]
}
Solution by ivan-abdulin #37357
type MyReadonly<T> = {
readonly [P in keyof T]: T[P];
}
Solution by minseonkkim #37343
// your answers
type MyReadonly<T> = {
+ readonly[k in keyof T]: T[k]
}
Solution by webMasterMrBin #37335
type MyReadonly<T> = {
readonly [P in keyof T]: T[P];
};
Solution by Nakamura25257 #37254
type MyReadonly<T> = {
readonly [P in keyof T]: T[P];
};
readonly
修饰属性只读keyof T
取类型 T 所有属性名返回联合类型in
+ 联合类型,返回对象类型 keySolution by djdidi #37117
type MyReadonly
Notes:
extends
.Obj[Prop]
).Solution by Dessouki98 #37055
type MyReadonly<T> = {
readonly [P in keyof T]: T[P]
}
Solution by 359Steve #37011
type MyReadonly<T> = {
readonly [P in keyof T]: T[P];
}
Solution by mag123c #36992
// this is too easy
type MyReadonly<T> = {
readonly [P in keyof T]: T[P];
}
Solution by YiShengYouNi #36970
// your answers
type MyReadonly<T> = {
readonly [k in keyof T]:T[k]
}
example of keyof
const human={
name:"XYZ",
age:10
}
const keys= keyof human;
// here keys = name | age
Solution by Anonymous961 #36957
by Anthony Fu (@antfu) #简单 #built-in #readonly #object-keys
不要使用内置的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
在 Github 上查看:https://tsch.js.org/7/zh-CN */
/* _____________ 你的代码 _____________ */
type MyReadonly
/* _____________ 测试用例 _____________ */ import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<MyReadonly
interface Todo1 { title: string description: string completed: boolean meta: { author: string } }
/* _____________ 下一步 _____________ / /
分享你的解答:https://tsch.js.org/7/answer/zh-CN 查看解答:https://tsch.js.org/7/solutions 更多题目:https://tsch.js.org/zh-CN */
Solution by wzjiscode #36954
type MyReadonly<T> = {
readonly [key in keyof T]:T[key]
}
Solution by zhangchenen #36952
解题思路
只需要在遍历的时候将属性设置为只读即可,此处需要用到typescript
中的修饰符readonly
题解
type MyReadonly<T> = {
readonly [K in keyof T]: T[K];
};
心得与知识点
::: tip typescript 中的修饰符
:::
Solution by lkwavestian #36944
// your answers
type MyReadonly<T> = {
readonly [K in keyof T]: T[K];
}
Solution by AlexBraunMagic #36920
type MyReadonly<T> = { readonly [P in keyof T]: T[P] }
Solution by shaishab316 #36838
type MyReadonly<T> = {
readonly[P in keyof T]: T[P];
} //Here we change from 'any' on this
import type { 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
}
}
Solution by GormanProg123 #36813
type MyReadonly<T> = {
readonly [key in keyof T]: T[key]
}
Solution by BernTheSeal #36808
// 你的答案
type MyReadonly<T> = {
readonly [P in keyof T]: T[P];
};
Solution by Huiyong-Chen #36801
type MyReadonly<T> = {
readonly [P in keyof T]: T[P]
}
/* _____________ Test Cases _____________ */
import type { 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
}
}
Solution by AnastasiaSv #36759
type MyReadonly
Solution by Abdullah-Elsayed01 #36743
// type MyReadonly<T> = {
readonly [K in keyof T]: T[K]
}
Solution by Mamdouhreda #36705