TIL에 한 편씩 집어넣으려 했으나, 분량문제로 시리즈를 분리하였다.
제네릭으로 2가지 타입을 받는다.
이를 이용하여 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]
}
하지만 오류가 발생.
아마 이미 존재하는 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
키워드를 적극적으로 활용했다.
P in keyof T
여기서 일단 타입이 T
객체 키값중 하나로 평가된다.as
이후 P extends K ? never : P
로 인하여 P
가 K
에서 상속되었다면 never
, 상속되지 않았다면 그대로 P
를 반환.as
키워드로 단언되었다.1번하고 뭐가 다른건가 싶기도 하고...TS가 타입을 평가하는 방식에 아마 차이가 있을 것 같다.
다음에는 TS가 타입을 평가하고 결정하는 방식에 대해 알아보는 편이 좋겠다!