5월인데
type Partial<T> = { [P in keyof T]?: T[P] };
이러한 종류의 변환은 동형이며, 이는 매핑이 T의 프로퍼티에만 적용되고 다른 프로퍼티에는 적용되지 않음을 의미합니다.
- 여기서 프로퍼티는
keyof T
로 정해져있다
- 하지만
Record
는 동형이 아니라고 한다
Record가 동형이 아니라는 한 가지 단서는 프로퍼티를 복사할 입력 타입을 받지 않는다는 것입니다. 동형이 아닌 타입은 본질적으로 새로운 속성을 생성하는 것입니다.
- Record 타입의 경우 미리 정의되지 않았기 때문에 프로퍼티가 새로 추가되는 형태로 쓰인다
- 내용이 읽다보니 어려워서
- 가장 중요한 내용은 마지막에
매핑된 유형을 만들 때는 동형을 목표로 하세요.
아닐까
- 항상 새로 추가되는 프로퍼티를 가질 수 있는 Record 라면 어디에 매핑되었다고 할 수 있을까 하고 질문을 던지면 간단하게 생각해볼 수 있겠다
- 단순하게 추론된 타입이 아니라 좀 더 정의된 형태의 타입으로 축소 시킨다는 느낌이다
const object = { ... } as const
하면 읽기 전용이 된다
- 튜플처럼 미리 정의된 타입으로만 추론되기를 기대하는 경우
- as const 를 사용하게 된다
const [state, setState] = useState()
의 타입이 (boolean | (() => void))[]
형태로 추론되지 않고 [boolean, () => void]
의 튜플로 추론된다
변수를 const 변수로 선언하는 것과 변수 끝에 “as const”를 추가하는 것은 다릅니다.
as const
자체가 ts 기능이기 때문인데
- js 입장에서는
const num = 1
로 상수를 변수 선언하게 되면 어차피 읽기 전용으로 쓰이는 것은 as const
와 동일하다
- 하지만 타입을 추론해야하는 입장에서는 상수로 선언된 변수 num 이 아니라
1
이라는 타입을 추론하고자 하기 때문에 as const
를 사용해야만한다
- 원시값이 아닌 배열이나 객체의 경우에도
as const
를 사용해 프로퍼티의 변경이나 배열의 프로토타입 함수를 사용하지 않는 읽기 전용 상수라는 것을 알릴 수 있다