내배캠 79일차

·2023년 1월 31일
0

내일배움캠프

목록 보기
86/142
post-thumbnail

generics과제
utilities과제

extends(generics)

필수 형식 매개 변수는 선택적 형식 매개 변수 다음에 올 수 없습니다.

<T = string | number, U = boolean, V extends T> // 에러발생
<V extends T, T = string | number, U = boolean> // GOOD
  
// 컴파일
strictCreateTupleTriplet("123", true, ["123"]); // ✅
strictCreateTupleTriplet(2023, false, [2023]); // ✅

// 에러 (진도를나갈 수 있도록 확인 후 주석처리하세요)
strictCreateTupleTriplet(2023, false, [123]); // ❌ ([123] 부분 에러)
strictCreateTupleTriplet("2023", false, ["i am a string"]); // ❌ (["i am a string"] 부분 에러)

하지만 이렇게 했을때 에러가 발생하지 않음!
왜냐 V가 받아오는 타입이 string|number라서 T가 2023 즉,number일때 V안의 값의 타입이 number인 123이기때문에 에러가 안남!
그래서 어제 슬쩍 본 as const를 이용하는 것인가? 싶었는데

export function strictCreateTupleTriplet<
  T extends string | number,
  V extends T,
  U = boolean
>(firstValue: T, secondValue: U, thirdValue: V[]): [T, U, V[]] {
  return [firstValue, secondValue, thirdValue];
}

이런식으로 T의 타입을 할당할때 = 대신 extends를 사용하면 T의 타입이 입력받은 값 예를 들면 2023으로 지정되기때문에 T의 속성값을 상속받는 V, 세번째 인자의 배열에 들어가야하는 타입이 2023이 되기때문에 123이 들어가면 에러가 발생한다!!

Required

success

type test = {
  ttest: undefined;
};
const tttest: Required<test> = {
  ttest: undefined,
};

Error

type test = {
  ttest?: undefined;
};
const tttest: Required<test> = {
  ttest: undefined,
};

선택 옵션인 속성이 undefined 타입을 가질때 Required 유틸리티 타입을 쓰면 never 이 됨!

profile
개발자 꿈나무

0개의 댓글