아이템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)