js-challenges icon indicating copy to clipboard operation
js-challenges copied to clipboard

TS体操--DeepReadonly

Open lhp96 opened this issue 2 years ago • 2 comments

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']
        },
      ]
    }
  }
}

// Your Answer
type DeepReadonly<T> = {
  +readonly [P in keyof T]: keyof T[P] extends never ? T[P] : DeepReadonly<T[P]>
}

// keyof T[P],看是否有对象的键

lhp96 avatar Feb 19 '23 13:02 lhp96

type DeepReadonly<T> = {
    readonly [p in keyof T] : T[p] extends object ? DeepReadonly<T[p]> : T[p]
}

Aurora-GSW avatar Mar 13 '24 14:03 Aurora-GSW

type MyReadonly<T extends Record<string, any>> = {
    readonly [K in keyof T]:T[K] extends Record<string, any> ? MyReadonly<T[K]> : T[K];
}

一个递归 主要在于判断是不是对象形式的类型 如果是就递归

jianxingyao avatar Jun 05 '24 10:06 jianxingyao