JIGGAG

5월 한달동안 로그

2024년 6월 4일

5월인데

  • 5월은 어린이날
  • 나는 어른이날

동형 매핑 타입(homomorphic mapped type)이 도대체 뭔가요?

  • type Partial<T> = { [P in keyof T]?: T[P] };
    • 이러한 종류의 변환은 동형이며, 이는 매핑이 T의 프로퍼티에만 적용되고 다른 프로퍼티에는 적용되지 않음을 의미합니다.
    • 여기서 프로퍼티는 keyof T 로 정해져있다
  • 하지만 Record 는 동형이 아니라고 한다
    • Record가 동형이 아니라는 한 가지 단서는 프로퍼티를 복사할 입력 타입을 받지 않는다는 것입니다. 동형이 아닌 타입은 본질적으로 새로운 속성을 생성하는 것입니다.
    • Record 타입의 경우 미리 정의되지 않았기 때문에 프로퍼티가 새로 추가되는 형태로 쓰인다
  • 내용이 읽다보니 어려워서
    • 가장 중요한 내용은 마지막에 매핑된 유형을 만들 때는 동형을 목표로 하세요. 아닐까
    • 항상 새로 추가되는 프로퍼티를 가질 수 있는 Record 라면 어디에 매핑되었다고 할 수 있을까 하고 질문을 던지면 간단하게 생각해볼 수 있겠다

(번역) 타입스크립트에서 'As Const' 이해하기

  • 단순하게 추론된 타입이 아니라 좀 더 정의된 형태의 타입으로 축소 시킨다는 느낌이다
  • 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 를 사용해 프로퍼티의 변경이나 배열의 프로토타입 함수를 사용하지 않는 읽기 전용 상수라는 것을 알릴 수 있다