개발자

TypeScript - Generic과 extends에 대한 질문입니다.

2024년 02월 26일조회 55

코드에서 getObject1("value1").foo는 미리 정의한 ValueType 타입을 가지는데, getObject2("value1").foo는 "value1" literal 타입을 가집니다. 제네릭을 사용하면 narrowing이 가해진 것과 같은 효과를 내는데, 이렇게 작동하는 이유가 무엇일까요?

1type ValueType = "value1" | "value2" | "value3";
2
3const getObject1 = (param: ValueType) => {
4  return { foo: param };
5};
6
7getObject1("value1").foo; // (property) foo: ValueType
8
9const getObject2 = <T extends ValueType>(param: T) => {
10  return { foo: param };
11};
12
13getObject2("value1").foo; // (property) foo: "value1"
이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 0

답변이 없을 때 보이는 아이콘

첫 답변을 기다리고 있어요.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 02월 26일

Generic을 사용했을 때 'narrowing'이 발생하는 이유는 TypeScript의 타입 추론 기능 때문입니다. 여기서 `T`는 generic type parameter로, 호출 시점에서 결정됩니다. 즉, `getObject2("value1")`를 호출할 때 `T`는 `"value1"`(`ValueType` 중 하나)으로 결정되고, 그래서 반환 객체의 `foo`는 `"value1"` 타입을 가집니다. 반대로, `getObject1("value1")`에서 `"value1"`은 파라미터의 타입으로 정해져 있지만, 반환 객체의 `foo` 속성에 대해서는 특별한 조건이 없어서 TypeScript compiler가 줄 수 있는 가장 넓은 (least constrained) 타입인 `ValueType`을 할당하게 됩니다. 결국, generic을 사용하면 함수를 호출할 때마다 각각 다른 타입이 할당될 수 있게 되며, 이것이 generic의 유용성 중 하나입니다. 이런 방식으로 코드를 작성하면 더욱 동적이고 유연하게 처리할 수 있습니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!