• [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']
            },
          ]
        }
      }
    }
  • 相关阅读:
    【LeetCode-位运算】位1的个数
    【LeetCode-数组】调整数组顺序使奇数位于偶数前面
    mySQL数据库中.frm和.myi和.myd和.ibd文件是什么文件?
    安装docker-compose的两种方式
    将第三方jar包 安装到 maven仓库
    limit分页查询
    pom.xml配置指定仓库
    linux常用命令
    正则笔记
    使用conda创建虚拟环境
  • 原文地址:https://www.cnblogs.com/Answer1215/p/16667929.html
Copyright © 2020-2023  润新知