인프런 커뮤니티 질문&답변

윤소미님의 프로필 이미지

작성한 질문수

한 입 크기로 잘라먹는 타입스크립트(TypeScript)

제네릭 인터페이스 & 제네릭 타입 별칭

타입스크립트 강의 제네릭 인터페이스, 제네릭 타입 별칭 질문

해결된 질문

24.05.31 11:24 작성

·

141

0

제네릭 인터페이스, 제네릭 타입 별칭 강의 13:19초부터

goToschool(developer);

에 Developer는 Student type에 할당할 수 없고,
그래서 타입좁히기는 없어도된다고 하셨는데
이 부분이 이해가 잘 안가서 부연설명을 자세히 해주실수 있을까요? ㅠㅠ 어렵네요

함수이름이 goToschool이고 developerUser의 경우 User<Developer > 형식 이기 때문에 할당이 불가능하다 정도는 이해했습니다.

답변 2

1

이정환 Winterlood님의 프로필 이미지
이정환 Winterlood
지식공유자

2024. 06. 03. 10:27

안녕하세요 이정환입니다.

우선 해당 실습 예제의 goToSchool 함수의 매개변수 user의 타입은 User<Student>로 정의되어 있습니다.

따라서 User<Developer> 타입의 값은 이 매개변수에 할당될 수 없다! 라는 이야기입니다.

그러므로 해당 함수 내에서는 별도의 조건문을 통해 user 매개변수에 담긴 값의 타입이 User<Student> 타입이 맞는지 확인하는 작업을 거칠 필요가 없습니다. 이미 매개변수의 타입을 User<Student>로 정의해 두었으니까요

요지는 제네릭을 사용하기 전에는 모두 User 라는 타입으로 통일하여 매개변수를 받아왔기 때문에 별도의 타입 좁히기가 필요했지만 제네릭을 활용하면 더 세분화된 타입으로 나누어 정의할 수 있기 때문에 더 이상의 타입 좁히기는 필요하지 않다는 의미입니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 06. 02. 11:26

안녕하세요, 인프런 AI 인턴입니다.

윤소미님 질문에 대해 답변드리겠습니다.

제네릭 인터페이스와 타입 별칭에서, Developer 타입은 Student 타입에 할당할 수 없다는 부분에 대해 궁금하시군요.

제네릭을 사용하는 경우 일반적으로 제네릭 타입은 그 사용 목적에 따라 여러 가지 타입을 받을 수 있는 형태로 정의됩니다. 그렇기 때문에 User<Developer> 형식은 User<Student> 형식과는 호환되지 않습니다. 이것은 타입스크립트에서 타입의 구조가 다르기 때문에 발생하는 현상으로, 타입스크립트의 기본적인 타입 시스템의 일부입니다.

함수 goToschool의 인자로 developer를 넣었을 때, Developer 타입은 Student 타입에 할당할 수 없다고 하셨는데, 이는 goToschool 함수가 Student 타입을 인자로 예상하지만, 실제로 넘겨진 인자가 Developer 타입이라는 의미입니다. 따라서 이 두 타입 합쳐서 사용할 때는 변환 과정이나 호환이 필요한 부분에서 타입을 좁혀야 할 필요가 있지만, 여기서 말하는 ‘타입을 좁히기’ 없이도 가능하다는 측면은 특정 조건에서 이 두 타입이 명확하게 구분될 경우를 의미할 수 있습니다.

즉, User<Developer>User<Student>와 다르기 때문에 직접적인 할당은 불가능하며, 이를 해결하기 위해서는 해당 타입들이 어떻게 정의되어 있는지, 그리고 함수 goToschool에서 어떤 타입의 인자를 기대하는지를 명확히 이해해야 합니다.

타입스크립트에서는 이러한 타입의 불일치를 해결하기 위해 타입 단언(type assertion), 타입 가드(type guards), 인터페이스 확장(extends) 같은 여러 방법을 사용할 수 있습니다. 그렇기 때문에 상세한 부분에 대해 더 깊이 이해하고 싶으시다면, 타입스크립트의 고급 타입 사용 방법에 대해 공부하시는 것도 추천드립니다.

원하는 답변을 찾지 못하셨다면, 강의 페이지의 우측 배너 혹은 하단 ‘문의하기’를 통해 강사님께 직접 질문을 남기는 것도 좋은 방법입니다.

추가로 궁금한 점이 있으시다면 언제든지 문의해주세요.