inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

조건부 타입 기반의 유틸리티 타입 - Exclude, Extract, ReturnType

typeof funcA 가 () => string 으로 추론될 수 있는 이유가 궁금합니다.

해결된 질문

191

banayj0909

작성한 질문수 2

0

안녕하세요! 강의 잘 듣고 있습니다.

type ReturnType<T extends (...args: any) => any> = T extends (
  ...args: any
) => infer R
  ? R
  : never
	
function funcA() {
  return 'hello'
}

type ReturnA = ReturnType<typeof funcA> // string

typeof funcA 를 출력해보면 () => string 이 아닌 'function'이 나오는데, ReturnType 타입변수 T로 넘겨줬을 때 R이 반환값을 어떻게 추론하게 되는 지 궁금합니다.

function에서 typeof 를 사용하면 자동으로 반환값 타입까지 가져오는건가요?

typescript

답변 2

0

이정환 Winterlood

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

결론부터 말씀드리면 typeof funcA의 타입과, 값은 다릅니다. 구체적으로 타입은 () => string 이 되고, 값은 Function이 됩니다.

따라서 제네릭 타입에 타입 매개변수로 typeof funcA가 넘겨졌을 경우 "타입"으로 넘겨지게 되어 타입 추론이 동작하는 것이구요, console.log로 출력했을 때에는 typeof funcA가 "값"으로 취급되기 때문에 Function 이 출력되게 되는것 입니다.

0

인프런 AI 인턴

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

질문해주신 내용은 타입스크립트의 typeof 키워드와 조건부 타입(Conditional Types) 사용과 관련된 사항입니다. 아래에서 상세히 설명드리겠습니다.

typeof는 자바스크립트의 런타임 내장 연산자이기도 하지만, 타입스크립트에서는 변수가 가리키는 타입을 추론하는 데 사용됩니다. 즉, 변수나 함수의 타입을 얻기 위한 목적으로 활용됩니다.

핵심 설명

  1. typeof funcA는 자바스크립트의 ‘typeof’와는 다르게 작동합니다.
    타입스크립트에서 typeof funcAfuncA의 타입을 가져옵니다. 즉, () => string이 됩니다. 이는 ‘function’ 과 같은 런타임 결과를 가져오는 자바스크립트의 typeof와 차이가 있습니다. 자바스크립트에서는 typeof funcA가 ‘function’을 반환하지만, 타입스크립트에서는 함수의 타입 시그니처 자체를 반환합니다.

  2. ReturnType 유틸리티 타입의 동작 방식입니다.

    type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : never;
    

    이 타입 정의는 함수 타입 T의 반환 타입을 추론하여 R로 리턴합니다. infer R는 특정 함수 타입이 제공될 때, 그 함수의 리턴 타입만을 추론하는 데 사용됩니다. 따라서 typeof funcA로 전달된 함수 타입에서 반환 타입 string을 추론합니다.

  3. 타입스크립트의 타입 시스템이 이를 가능하게 합니다.
    함수 funcA() => string 타입을 가지며, ReturnType<typeof funcA>는 해당 함수가 반환하는 값의 타입을 추론하여 리턴합니다. 이 과정에서 string이 추론되며, ReturnA의 타입이 string으로 결정됩니다.

추가적으로, 타입스크립트에서의 ReturnType 유틸리티 타입 관련 설명도 참고하시면 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

0

12

1

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

0

30

2

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

0

65

1

호출 시그니처 질문

0

66

2

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

0

75

2

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

0

67

1

할인쿠폰 관련하여

0

160

2

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

0

94

2

안녕하세요 이정환님!

0

92

1

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

0

79

2

함수 타입 호출 시그니처

0

58

1

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

0

64

2

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

0

118

4

마우스 호버 시 정보

0

92

2

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

1

89

2

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

0

83

2

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

0

137

2

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

0

100

2

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

0

129

1

type: module

0

97

2

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

0

76

1

슈퍼타입질문

1

64

2

프로젝트 설치

0

104

2

enum은 비원시 타입이면서 열거형 타입이 되는건가요?

0

70

2