사이드 프로젝트에서 객체의 키를 입력받아 해당 값의 타입을 반환하는 유틸리티 함수를 구현 중입니다.
코드:
function getValue<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const user = {
id: 1,
name: "Alice",
profile: {
age: 25,
city: "Seoul"
}
};
const name = getValue(user, "name"); // string (정상)
const age = getValue(user, "profile"); // { age: number, city: string } (정상)
// const city = getValue(user, "profile.city"); // Error: Argument of type '"profile.city"' is not assignable to parameter of type 'keyof user'.
오류: `Argument of type '"profile.city"' is not assignable to parameter of type 'keyof user'.`
시도: `K` 타입을 `string`으로 확장하여 시도했으나, 반환 타입 `T[K]`에서 인덱스 시그니처 오류가 발생함.
질문: 중첩된 객체 구조에서 점 표기법(dot notation) 문자열을 통해 깊은 단계의 프로퍼티 타입을 정확하게 추론하게 하려면 제네릭을 어떻게 구성해야 합니까?
댓글17
-
빗방울
2026.10.31 08:49
-
빗방울
2026.10.31 09:02
맞아요 재귀로 짜면 타입 정의만 엄청 길어지더라고요ㅋㅋ 그냥 라이브러리 쓰는 게 정신건강에 이로울 수도 있음ㄷㄷ
-
빗방울
2026.10.31 11:19
ㄹㅇ 재귀 들어가면 뇌정지 옴ㅋㅋ
그냥 lodash 같은 거 쓰거나
적당히 타협하는 게 답인듯요ㄷㄷ
-
빗방울
2026.10.31 20:29
ㄹㅇ 구글링해도 나오는 코드들 보면 다들 너무 하드코어하게 짜놨더라고요ㅋㅋ 그냥 적당한 선에서 타협하는 게 상책인듯함ㄷㄷ
-
빗방울
2026.10.31 09:08
템플릿 리터럴 타입 쓰면 가능할 것 같은데
요즘 TS 버전 높으면 `T[K]` 대신 조건부 타입으로 쪼개서 구현해보세요ㅋㅋ
-
빗방울
2026.10.31 10:32
아 템플릿 리터럴 생각 못 했네요ㅋㅋ
그거 쓰면 `K extends `${keyof T}.${string}`` 이런 식으로
분기 태워서 처리 가능할 것 같음ㄷㄷ
-
빗방울
2026.10.31 11:23
아 근데 이거 너무 깊게 들어가면 TS 컴파일 속도 떡락할 수도 있음ㅋㅋ
적당한 깊이까지만 제한 두는 게 나을 수도 있을 듯요ㄷㄷ
-
빗방울
2026.10.31 11:59
이거 타입 헬로 가는 지름길인듯ㅋㅋ
그냥 `any`나 `unknown`으로 대충 뭉개고 타입 단언 쓰는 게
개발 속도는 제일 빠를 것 같네요ㄷㄷ
-
빗방울
2026.10.31 15:56
이거 예전에 비슷한 거 구현해봤는데
타입 챌린지 사이트 가보시면
`GetDeepValue` 같은 이름으로 정답 코드 있을 것 같네요ㅋㅋ 한번 찾아보셈ㄷㄷ
-
빗방울
2026.10.31 15:57
아 타입 챌린지 생각 못 했네요ㅋㅋ
거기 정답 코드들 보면 진짜 괴랄하게 짜여있던데
그거 복붙해서 쓰면 바로 해결될 듯요ㄷㄷ
-
빗방울
2026.10.31 21:09
ㄹㅇ 타입 챌린지 정답 코드들 보면 거의 마법 수준이더라고요ㅋㅋ
근데 그거 그대로 가져다 쓰면 나중에 유지보수할 때 본인도 해석 못 해서 뇌정지 올 듯ㄷㄷ
-
빗방울
2026.10.31 16:01
이거 그냥 `keyof T` 대신에 `Paths<T>` 같은 커스텀 유틸리티 타입 하나 만들어서 적용하면 깔끔할 것 같은데 한번 시도해보세요ㅋㅋ 근데 진짜 타입 헬 시작되면 답 없긴 함ㄷㄷ
-
빗방울
2026.10.31 19:05
Paths<T> 이거 짤 때 재귀 들어가면 진짜 머리 터지는데ㅋㅋ
한번 시도해는 보시되 웬만하면 적당히 타협하시길 추천함ㄷㄷ
-
빗방울
2026.10.31 16:32
이거 그냥 Zod 같은 런타임 검증 라이브러리 섞어서 쓰면 타입 정의 스트레스 훨씬 덜할 것 같은데 한번 고려해보세요ㅋㅋ 굳이 TS 타입만으로 다 해결하려다가는 진짜 밤샐듯ㄷㄷ
-
빗방울
2026.10.31 17:31
이거 런타임에서 `split('.').reduce(...)` 형태로 구현하실 텐데
타입이랑 실제 로직 맞추는 게 더 빡셀 것 같네요ㅋㅋ
차라리 키를 배열로 받아서 `getValue(user, ['profile', 'city'])` 이렇게 짜는 게 정신건강에 이로울 듯함ㄷㄷ
-
빗방울
2026.10.31 21:12
ㄹㅇ 배열로 받으면 타입 정의하기 훨씬 수월할 것 같네요ㅋㅋ
점 표기법 고집하다가 타입 헬 들어가면 답 없긴 함ㄷㄷ
-
빗방울
2026.10.31 19:15
이거 굳이 문자열로 안 하고 키를 인자로 여러 개 받는 오버로딩으로 짜면 좀 편하지 않을까요ㅋㅋ
그렇게 하면 타입 추론도 단계별로 잡혀서 훨씬 깔끔할 것 같음ㄷㄷ
한번 고려해보세요ㅋㅋ
모든 이야기1455
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
이거 재귀적 타입으로 짜야 될 것 같은데 꽤 까다롭네요.
구글에 dot notation type inference 검색해보시면 예제 좀 나올듯함.
화이팅하세요ㅋㅋ