[Typescript] 18. Medium - Deep Readonly

Implement a generic DeepReadonly<T> which make every parameter of an object - and its sub-objects recursively - readonly.

You can assume that we are only dealing with Objects in this challenge. Arrays, Functions, Classes and so on do not need to be taken into consideration. However, you can still challenge yourself by covering as many different cases as possible.

For example:

type X = { 
  x: { 
    a: 1
    b: 'hi'
  }
  y: 'hey'
}

type Expected = { 
  readonly x: { 
    readonly a: 1
    readonly b: 'hi'
  }
  readonly y: 'hey' 
}

type Todo = DeepReadonly<X> // should be same as `Expected`
/* _____________ Your Code Here _____________ */

// solution 1
type XP = string | number | boolean | ((...args: any[]) => any)
type DeepReadonly<T> = {
  readonly [P in keyof T]: T[P] extends XP
    ? T[P]
    : DeepReadonly<T[P]>
}

// solution 2
type DeepReadonly<T extends Record<PropertyKey, any>> = T extends (...args: any[]) => any
  ? T
  : {
    readonly [Key in keyof T]: DeepReadonly<T[Key]>
  }

/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
type XX = {  a: () => 22
  b: string, d: ['key']}
type x = DeepReadonly<XX>
type cases = [
  Expect<Equal<DeepReadonly<X>, Expected>>,
]

type X = {
  a: () => 22
  b: string
  c: {
    d: boolean
    e: {
      g: {
        h: {
          i: true
          j: 'string'
        }
        k: 'hello'
      }
      l: [
        'hi',
        {
          m: ['hey']
        },
      ]
    }
  }
}

type Expected = {
  readonly a: () => 22
  readonly b: string
  readonly c: {
    readonly d: boolean
    readonly e: {
      readonly g: {
        readonly h: {
          readonly i: true
          readonly j: 'string'
        }
        readonly k: 'hello'
      }
      readonly l: readonly [
        'hi',
        {
          readonly m: readonly ['hey']
        },
      ]
    }
  }
}

 

posted @   Zhentiw  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2020-09-08 [CSS 3] content-visibility: auto Improve rendering performance
2020-09-08 [Machine Learning] Neural Networks: Representation Quiz
2018-09-08 [GraphQL] Query Local and Remote Data in Apollo Link State
2018-09-08 [Spring Boot ] Creating the Spring Boot Project : Demo: Creating a REST Controller
2018-09-08 [Web Analytics] Into to Web Analytics
2016-09-08 [AngularJS] Test an Angular Component with $componentController
2016-09-08 [AngularJS] Isolate State Mutations in Angular Components
点击右上角即可分享
微信分享提示