• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

section7 - 타입 변수 응용하기

23.06.08 14:31 작성 조회수 308

0

안녕하세요 제네릭 타입 변수 응용하기 부분을 듣고 있는데

9:34초의 두번째 사례에서

function returnFirstValue<T>(data: [T, ...unknown[]): T {
  return data[0];
}

...unknown[]으로 선언하셨는데

function returnFirstValue<T, U>(data: [T, ...U[]]): T {
  return data[0];
}

제가 타입변수 U를 추가하여 ...U[]으로 선언했는데 에러가 발생하지 않았습니다. 이것도 ...unknown[]처럼 같은 형식 인가요?

답변 2

·

답변을 작성해보세요.

0

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

올려주신 코드에서 ...unknown[]과 ...U[]의 차이는 간단합니다.

매개변수의 타입을 [T, ...unknown[] ] 으로 정의하는 의미는 배열의 첫번째 요소의 타입은 T이고 나머지 요소의 타입은 unknown으로 정의한다는 뜻 입니다.

매개변수의 타입을 [T, ...U[] ]로 정의하는 의미는 배열의 첫번째 요소의 타입은 T이고 나머지 요소의 타입은 U로 정의한다는 의미입니다.

따라서 만약 이 함수에 인수로 전달하는 배열이 [1, "2", true] 일 경우 T는 number, U는 string | boolean이 됩니다.

HK님의 프로필

HK

질문자

2023.06.12

...unknown[]은 최상위 타입이라 unknown로 추론되고,

...U[] 타입은 유니언타입으로 추론 된다고 이해 하면 될까요?

무조건 유니언 타입으로 추론된다기 보다는 최적의 공통 타입(Best Common Type)으로 추론된다고 보시는게 더 적절할 것 같습니다.

예를 들어 인수로 전달되는 값이 [1, 2, 3]일 때에는 U는 유니언타입이 아닌 number타입으로 추론됩니다. 첫번째 요소를 제외한 나머지 요소의 타입이 모두 number 타입이기 때문입니다.

반대로 [1, "2", true]일 경우 두번째 요소의 타입은 string, 세번째 요소의 타입은 boolean이므로 두 요소의 타입을 모두 만족하기 위해 최적의 공통 타입인 string | boolean 타입으로 추론됩니다.

여기서 요점은 모든 요소를 포함할 수 있는 타입으로 U의 타입이 자동 추론된다는 점에 있습니다.
따라서 무조건 유니언 타입으로 추론된다고 하기에는 어렵습니다

이렇게 추론되는 원리는 마치 배열의 타입을 타입스크립트가 자동 추론하는 방식과 유사합니다.
만약 다음과 같이 배열을 선언한다면

let arr = [1, "2", true]

타입스크립트는 변수 arr의 타입을 (number | string | boolean)[]로 추론하게 됩니다. 이런 방식의 추론을 "최적 공통 타입 추론"이라고도 합니다.

HK님의 프로필

HK

질문자

2023.06.12

완전히 이해 했습니다. 답변 감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.06.10

안녕하세요, 인프런 AI 인턴이에요.

제네릭 함수에서 ‘…’ 연산자로 선언하는 타입 매개변수 부분은 ‘rest parameter’ 라고 불리며, 순서대로 변수들을 모두 하나의 값으로 묶는 역할을 합니다. 따라서 ‘…’ 연산자 다음에 오는 부분은 해당 매개변수로 전달되는 값들의 타입을 정의하는데 사용됩니다.

위의 두 예제에서 사용된 매개변수 타입 정의에서는 ‘…unknown[]’ 와 ‘…U[]’ 두 가지 방법이 사용되었습니다. 이 둘은 형식은 다르지만, 기능적으로는 동일합니다. ‘unknown’은 TypeScript에서 제공하는 특별한 타입으로, 해당 매개변수들이 어떤 데이터 타입들을 받을 수 있는지 추론하기 어려울때 사용됩니다. ‘U’라는 타입 변수를 직접 정의하여 해당 매개변수가 어떤 타입의 값들을 받을 수 있는지 미리 알고 있을 경우, 이 방법으로도 선언할 수 있습니다.

즉, ‘…unknown[]’ 와 ‘…U[]’ 모두 같은 역할을 하는 방법이지만, ‘unknown’은 TypeScript에서 제공하는 특별한 타입으로, ‘U’는 사용자가 직접 정의한 타입 변수입니다.

더 궁금한 사항이 있으면 언제든지 댓글로 문의해주세요. 좋은 하루 되세요!