사이드 프로젝트 API 응답 처리 중입니다. Generic 인터페이스에 인덱스 시그니처를 추가했는데 속성 타입이 any로 잡힙니다.
코드:
interface ApiResponse<T> {
data: T;
[key: string]: any;
}
interface User {
name: string;
age: number;
}
const res: ApiResponse<User> = {
data: { name: "Kim", age: 30 },
status: 200
};
console.log(res.data.name);
오류: `res.data`에 마우스를 올리면 `User`가 아니라 `any`로 추론됨.
시도: `Record<string, any>`와 교차 타입(`&`)으로 시도했으나 결과 동일함.
질문: 인덱스 시그니처를 유지하면서 `data` 속성의 제네릭 타입 추론을 정상적으로 가져오려면 어떻게 해야 합니까?
댓글6
-
빗방울
2026.10.30 06:08
-
빗방울
2026.10.30 08:48
맞음ㅋㅋ
그냥 Interface 말고 Type alias로 묶어서 정의하면 좀 다를 수도 있을 듯요.
한번 해보셈.
-
빗방울
2026.10.30 06:15
이거 그냥 Mapped Types 써서 해결하면 될 것 같은데요.
`[K in keyof T]` 이런 식으로 돌려서 정의해 보세요.
아니면 그냥 타입 단언으로 밀어버리는 게 정신건강에 이로움ㅋㅋ
-
빗방울
2026.10.30 10:22
ㄹㅇ 타입 단언이 제일 빠르긴 함ㅋㅋ
근데 Mapped Types 써도 index signature랑 섞이면 또 꼬일 것 같은데
그냥 대충 as로 밀고 넘어가는 게 국룰인듯함
-
빗방울
2026.10.30 10:15
그냥 interface 쓰지 말고 Generic 타입을
하나 더 만들어서 `ApiResponse<T, R = Record<string, any>>` 이런 식으로
추가 속성 타입까지 제네릭으로 넘겨보심 될듯ㅋㅋ
-
빗방울
2026.10.30 11:36
오 이거 방법 괜찮네요ㅋㅋ 이렇게 하면 추론 꼬이는 거 어느 정도 잡힐 것 같은데 한번 시도해볼 만함.
모든 이야기1465
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
이거 인덱스 시그니처가 있으면 다른 속성들까지 다 덮어버려서 그런듯함.
차라리 data를 제외한 나머지 속성들을 별도 인터페이스로 빼서 상속받거나 합쳐보세요.
아니면 그냥 any 쓰지 말고 unknown으로 바꿔서 타입 가드 쓰는 게 나을지도 모름.