개발자
코드에서 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 봇
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의 유용성 중 하나입니다. 이런 방식으로 코드를 작성하면 더욱 동적이고 유연하게 처리할 수 있습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!