[Effective TypeScript] 2장 16-18 타입 스크립트의 타입시스템

채동기·2023년 2월 24일
0

TypeScript

목록 보기
8/21

아이템16) number 인덱스 시그니처보다는 Array, 튜플, ArrayLike를 사용하기

  • 배열은 객체이므로 키는 숫자가 아니라 문자열입니다. 인덱스 시그니처로 사용된 number 타입은 버그를 잡기 위한 순수 타입 스크립트 코드입니다.
  • 인덱스 시그니처에 number를 사용하기보다 Array나 튜플, 또는 ArrayLike 타입을 사용하는 것이 좋습니다.

아이템 17) 변경 관련된 오류 방지를 위해 readonly 사용하기

readonly 는 몇가지 특성이 있습니다.

  • 배열의 요소를 읽을 수 있지만, 쓸 수는 없습니다.
  • length를 읽을 수 있지만, 바꿀 수는 없습니다.(배열을 변경함)
  • 배열을 변경하는 pop을 비롯한 다른 메서드를 호출할 수 없습니다.

number[] 는 readonly number[]보다 기능이 많기 떄문에, readonly number[]의 서브 타입이 됩니다.
변경 가능한 배열을 readonly에 할당할 수 있지만 그 반대는 불가능합니다.

const a: number[] = [1, 2, 3];
const b: readonly number[] = a; //가능
const c: number[] = b; // 불가

readonly를 선언하면 다음과 같은 일이 생깁니다.

  • 매개 변수가 함수 내에서 변경되는지 체크합니다.
  • 호출하는 쪽에서 함수가 매개변수를 변경하지 않는다는 보장을 받게 됩니다.
  • 호출하는 쪽에서 함수에 readonly 배열을 매개변수로 넣을 수 있습니다.

const와 readonly의 차이를 이해해야 합니다.
readonly는 얇게 동작합니다.

아이템 18) 매핑된 타입을 사용하여 값을 동기화하기

  • 매핑된 타입을 사용해서 관련된 값과 타입을 동기화하도록 합니다.
  • 인터페이스에 새로운 속성을 추가할 때, 선택을 강제하도록 매핑된 타입을 고려해야 합니다.

출처

<이펙티브 타입스크립트> (댄 밴더캅 지음, 장원호 옮김, 인사이트, 2021)

profile
what doesn't kill you makes you stronger

0개의 댓글