중첩된 객체의 모든 속성만 나열하고 Union Type의 단일 패드로 설정합니다.

10267 단어 TypeScript
어디에서 사용할 수 있는지 모르겠지만 끼워 넣는 대상의 모든 속성을 열거하여 Union Type의 단일 패드로 만들었기 때문에 적어두었다
type ValueOf<T> = T[keyof T];
type Property<T> = keyof T | ValueOf<{[K in keyof T]: T[K] extends object ? Property<T[K]> : never}>
라이너라고는 하지만 두 줄은 귀엽다
다음 느낌으로 사용할 수 있어요.
interface User {
  name: string,
  id: string,
  obj: {
    obj2: {
      aaa: string
    },
    bbb: string,
  }
}
type ValueOf<T> = T[keyof T];
type Property<T> = keyof T | ValueOf<{[K in keyof T]: T[K] extends object ? Property<T[K]> : never}>

type UserProperty = Property<User> //=> "name" | "id" | "obj" | "obj2" | "bbb" | "aaa"

참고로 끼워 넣은 속성을 검사할 필요가 없다면 아래는 충분하다
type Property<T> = keyof T //=> "name" | "id" | "obj"

깊이 지정 소득


이미 하나의 패드가 아니지만 아래와 같이 쓰면 지정된 깊이를 통해 속성을 얻을 수 있습니다

// 5階層まで対応。もっと深くまで辿りたい場合は 6:5 のように増やす
type NumMap = {
    5:4,
    4:3,
    3:2,
    2:1,
    1:1,
}

type ValueOf<T> = T[keyof T];
type Property2<T,P extends keyof NumMap> = P extends 1 ?  keyof T : ValueOf<{[K in keyof T]: T[K] extends object ? Property2<T[K], NumMap[P]> : never}>
다음과 같이 사용할 수 있습니다.
interface User {
  name: string,
  id: string,
  obj: {
    obj2: {
      aaa: string
    },
    bbb: string,
  }
}

type NumMap = {
    5:4,
    4:3,
    3:2,
    2:1,
    1:1,
}

type ValueOf<T> = T[keyof T];
type Property2<T,P extends keyof NumMap> = P extends 1 ?  keyof T : ValueOf<{[K in keyof T]: T[K] extends object ? Property2<T[K], NumMap[P]> : never}>

type UserProperty = Property2<User,2> //=> "obj2" | "bbb"

총결산


Type Script 대단하다.

참고 자료

좋은 웹페이지 즐겨찾기