[Typescript] 119. Extreme - Get Readonly Keys

Implement a generic GetReadonlyKeys<T> that returns a union of the readonly keys of an Object.

For example

interface Todo {
  readonly title: string
  readonly description: string
  completed: boolean
}

type Keys = GetReadonlyKeys<Todo> // expected to be "title" | "description"
/* _____________ Your Code Here _____________ */

type GetReadonlyKeys<T> = keyof {
  [Key in keyof T as Equal<Pick<T, Key>, Readonly<Pick<T, Key>>> extends true ? Key: never]: T[Key]
}

/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<'title', GetReadonlyKeys<Todo1>>>,
  Expect<Equal<'title' | 'description', GetReadonlyKeys<Todo2>>>,
]

interface Todo1 {
  readonly title: string
  description: string
  completed: boolean
}

interface Todo2 {
  readonly title: string
  readonly description: string
  completed?: boolean
}

 

posted @   Zhentiw  阅读(118)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2017-11-27 [Python] Problem with Default Arguments
2017-11-27 [Python] Tuples
2016-11-27 [AngularFire 2] Protect Write Access Using Security Rules
2015-11-27 [Javascript] Array methods in depth - slice
2015-11-27 [ES6] ... spread operator
2015-11-27 [AngularJS] New in Angular 1.5 ng-animate-swap
2014-11-27 [AngularJS] TweenList 3D + AngularJS Animate
点击右上角即可分享
微信分享提示