인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

opop0421님의 프로필 이미지
opop0421

작성한 질문수

[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편

제네릭 조건부 타입 함수

작성

·

260

0

안녕하세요 혹시 제네릭 조건부 타입으로 함수를 정의하였는데요

 

function double<T extends string | number>( x: T): T extends string ? string:number{

return x;

}

// 이렇게 하면 
'T' 형식은 'T extends string ? string : number' 형식에 할당할 수 없습니다.
  'string | number' 형식은 'T extends string ? string : number' 형식에 할당할 수 없습니다.
    'string' 형식은 'T extends string ? string : number' 형식에 할당할 수 없습니다.
이런 오류가 뜨는데 아직 함수의 반환타입이 정해지지 않아서 그런건가요?
왜 이러는지 이유가 궁금합니다!

답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

https://github.com/microsoft/TypeScript/issues/48746

이 이슈일텐데요. 제네릭+유니언인 T는 제일 마지막에 평가되므로 T가 뭔지 모르는 상황에서는 T extends string ? string : number도 뭔지 알 수 없어서 문제가 됩니다.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

T가 string | number인데 왜 뭔지 모르냐고 하실 수도 있는데, T는 never가 될 수도 있습니다.

never extends string | number === true

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

function double<T extends ([T] extends [string] ? string : number)>( x: T): [T] extends [string] ? string:number{
    return x;
}
const a = double('hi');
const b = double(123);
opop0421님의 프로필 이미지
opop0421
질문자

아아 와! 완전 이해됐습니다! 감사합니다!!!!

opop0421님의 프로필 이미지
opop0421

작성한 질문수

질문하기