중첩된 객체의 모든 속성만 나열하고 Union Type의 단일 패드로 설정합니다.
10267 단어 TypeScript
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 대단하다.
참고 자료
Reference
이 문제에 관하여(중첩된 객체의 모든 속성만 나열하고 Union Type의 단일 패드로 설정합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/KuwaK/items/587205867d333b705a41텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)