Ts Challenge(1) - MyReadonly2

김영현·2024년 5월 13일
0

ts challenge

목록 보기
1/6

짤막한 서론

TIL에 한 편씩 집어넣으려 했으나, 분량문제로 시리즈를 분리하였다.


MyReadonly2

제네릭으로 2가지 타입을 받는다.

  • T : 객체의 타입
  • K : readonly로 바꿀 타입.

이를 이용하여 T객체의 K타입들을 readonly로 바꾸어 보자.

첫번째 풀이

type MyExclude<T, U> = T extends U ? never : T

type MyReadonly2<T, K extends keyof T = keyof T> = {
  readonly [P in K]: T[P]
} & {
  [P in MyExclude<keyof T,K>]: T[P]
}
  1. 저번에 제작했던 MyExclude를 활용한다.
  2. K에있는 키값들은 전부 읽기전용.
  3. 객체타입 T에서 K를 전부제거한 값인 P키값은 읽기전용이 아니다.

하지만 오류가 발생.

아마 이미 존재하는 readonly를 인식하지 못하는것 아닐까...?
그래서 고민하다가 끝내 풀이를 보았다.

두번째 풀이 (풀이참고)

type MyReadonly2<T, K extends keyof T = keyof T> = {
  readonly [P in K]: T[P]
} & {
  [P in keyof T as P extends K ? never : P]: T[P]
}

MyExclude를 풀어서 사용한점이 인상깊다. 특히 as키워드를 적극적으로 활용했다.

  1. P in keyof T 여기서 일단 타입이 T객체 키값중 하나로 평가된다.
  2. as이후 P extends K ? never : P로 인하여 PK에서 상속되었다면 never, 상속되지 않았다면 그대로 P를 반환.
  3. as키워드로 단언되었다.

1번하고 뭐가 다른건가 싶기도 하고...TS가 타입을 평가하는 방식에 아마 차이가 있을 것 같다.
다음에는 TS가 타입을 평가하고 결정하는 방식에 대해 알아보는 편이 좋겠다!

profile
모르는 것을 모른다고 하기

0개의 댓글