inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전 연습으로 익히는 고급 타입스크립트 기술

Type argument 타입 제한

섹션 7의 Type argument 타입 제한에 대해 좀 더 설명을 해주실 수 있을까요?

해결된 질문

256

웹나그네

작성한 질문수 8

1

extends로 타입을 제한하면 string이나 number가 아닌 해당 값으로 추론되는 이유가 무엇인지 잘 와닿지 않아서요😂

제한을 하나 안 하나 제네릭에 string 혹은 number로 추론이 되어야 하지 않나 싶은데,

T extends object | [] 이렇게 제한을 걸면 string이나 number처럼 정확히 추론이 되지 않구요😂

타입스크립트는 extends로 제한을 걸면 구체적으로 추론을 해주는 이유가 뭔지 궁금하네요🤔

typescript

답변 2

0

애프터캠프

혹시 제가 질문의 의도를 잘못 이해한 거라면 답글 달아주세요!

 

0

애프터캠프

안녕하세요 우선 답부터 말씀드리면 말씀하신대로 extends string | number 빼면 추론이 제대로 되어야 하는게 맞습니다.

T extends object | [] 이렇게 제한을 걸면 string이나 number처럼 정확히 추론이 되지 않구요 😂

정확히 추론이 안된다는 것이 어떤 의미인지 제가 이해를 못했지만 extends string | number 를 빼면

error1

{
  output: {
    a: number
  }
}

로 추론이 되고,

error2

{
  output: number[]
}

로 추론이 되네요.

이 문제의 의도는 inferItemLiteral 에 string 또는 number만 허용하고 나머지 타입들은 허용하지 않게 하는게 목적이었습니다. 그래서 그런 타입 제한을 하게 된 것입니다. (노란색 사각형 영역처럼 object나 array 넘기면 타입 에러가 발생하도록)

image

1

웹나그네

넵 문제의 의도는 이해했습니다🙂

제가 의문스러운 건

<T extends  object | [...any]> ...

const result1 = inferItemLiteral([1,2,3]) // { output: number[] }
const result2 = inferItemLiteral({aaa:'abcd'}); // { output: { aaa: string } }

{ output: [1,2,3] }으로 기대했는데 { output: number[] }가 결과값으로 나온 게 왜 그런건지 궁금해서 질문을 드렸습니다🙂

강의 진도를 더 나가다보면 왜 그런지 이해가 될까요?

1

애프터캠프

아하 질문하신 의도를 이제 알았습니다! 제가 생각나는 방법은 여러가지가 있는데

 

첫번째 방법

tuple로 추론하게 하고 싶은 거라면 가장 간단한 방법은 다음과 같이 할 수 있겠네요.

<T extends  object | [any, ...any]>

이렇게 하시면 원하는 의도대로 추론이 될 것입니다. 그런데 이 방법의 단점은

const result1 = inferItemLiteral([1,2,"hello"])

위와 같이 number 뿐만 아니라 string "hello" 이 들어올 수 있게 허용해준다는 것이 있을 것 같네요.

 

두번째 방법

<T extends  object | [...any]>
const result1 = inferItemLiteral([1,2,3] as [number, number, number])

type asserts 를 이용해서 array가 아니라 명시적으로 tuple 이라는 것을 알려줄 수 있는 방법도 있습니다.

 

세번째 방법

<T extends  object | [...any]>
const error2 = inferItemLiteral([1, 2] as const);

뒤에 as const 를 붙이게 되면 두번째 방법보다 더욱 쉽게 해결할 수 있겠네요

1

웹나그네

감사합니다 이해했습니다!

이게 된다는걸 어떻게 판단할 수 있나요?

0

62

2

연습문제 강의 확인 부탁드립니다.

0

80

2

object key 질문드립니다.

0

67

1

행운 닉네임 등록부탁드립니다!

0

137

2

각 강의에 대한 설명 링크 404에러

0

72

2

행운문제 닉네임 등록 요청드립니다

0

65

2

블로그 링크 문제

1

124

1

제네릭과 사용자 정의 타입 가드에 관한 질문

1

168

1

제네릭 타입 제한을 하는것이 어떤 장점이 있을까요 ?

1

142

1

행운문제 닉네임 등록 신청합니다!

0

113

2

행운문제 테스트 유저 이름 입력 요청

0

129

2

행운문제 닉네임 입력 요청

1

158

2

행운문제 테스트 유저 이름 입력 요청

1

141

2

설명 블로그에 대한 질문

2

129

3

행운동전!

0

115

2

행운문제 테스트 유저 이름 입력 요청

0

122

1

행운 테스트 문제 400 에러

0

177

2

행운 테스트 문제 (존재하지 않는 유저입니다.)

1

203

2

행운테스트 동전이용!!

0

209

2

연습문제 링크 이슈

2

223

3

화살표 함수와 일반 함수의 매개변수 추론 관련

1

311

2

제네릭을 활용해서 정답을 맞춰보았습니다!

1

334

2

cache 강의 질문

1

213

1

Record의 제네릭은 자동적으로 바뀌나요?

0

383

2