inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

타입 변수 응용하기

section7 - 타입 변수 응용하기

575

HK

작성한 질문수 15

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[]처럼 같은 형식 인가요?

typescript

답변 2

0

이정환 Winterlood

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

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

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

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

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

1

HK

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

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

1

이정환 Winterlood

무조건 유니언 타입으로 추론된다기 보다는 최적의 공통 타입(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)[]로 추론하게 됩니다. 이런 방식의 추론을 "최적 공통 타입 추론"이라고도 합니다.

0

HK

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

0

인프런 AI 인턴

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

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

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

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

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

핸드북 light/dark mode 관련 이슈가 있는 것 같습니다.

0

31

1

제네릭 클래스 핸드북 페이지가 undefined라고 나옵니다.

0

33

2

적절한 타입 찾기 React.ChangeEvent<HTMLInputElemen>

0

41

2

outDir 옵션 추가 후 컴파일 오류 질문

0

86

1

호출 시그니처 질문

0

72

2

서로소 유니언 타입이 discriminated union과 동의어 인가요?

0

85

2

조건부타입소개 중 함수오버로딩 활용 시 인수의타입과 함수의 반환값의 타입이 깨지는 문제

0

72

1

할인쿠폰 관련하여

0

170

2

프론트엔드에서의 인터페이스활용

0

103

2

안녕하세요 이정환님!

0

98

1

Node.js 설치에 관한 질문입니다.

0

83

2

함수 타입 호출 시그니처

0

63

1

35강. 모듈 보강은 라이브러리 파일을 직접 편집해야 하나요?

0

70

2

인터페이스 문법이 있는데 타입 별칭 문법은 왜 있나요?

0

122

4

마우스 호버 시 정보

0

100

2

vite으로 리액트 빌드하기를 업데이트해주세요.

1

93

2

타입가드를 만들어 사용하는 이유가 궁금합니다.

0

90

2

섹션 12가 너무 어려운데... 정상이겠죠..?

0

142

2

선생님.. 알고리즘도 강의해주시면안되나요

0

106

2

선생님은 어떻게 이런걸 아세요?

0

137

1

type: module

0

104

2

7:17초 업캐스팅 질문이있습니다!

0

84

1

슈퍼타입질문

1

70

2

프로젝트 설치

0

117

2