TypeScript 类型体操 —— 深度 Readonly

89 阅读1分钟

题目地址

实现

type DeepReadonly<T extends Record<string, unknown>> = {
  readonly [P in keyof T]: T[P] extends Function
    ? T[P]
    : T[P] extends Record<string, unknown>
    ? DeepReadonly<T[P]>
    : T[P];
};


type X = { 
  x: { 
    a: 1
    b: 'hi'
  }
  y: 'hey',
  say: (name: string) => {},
  1: '123',
  arr: [{
    x: 1
  }]
}

type T = DeepReadonly<X>

/*
type T = {  
  readonly x: { 
    readonly a: 1
    readonly b: 'hi'
  }
  readonly y: 'hey',
  readonly say: (name: string) => {},
  readonly 1: '123',
  readonly arr: [{
    x: 1
  }];
}
*/