← Back to NOTES 🌰 ← Back to Effective TypeScript

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

핵심 요약

함수가 매개변수를 수정하지 않는다면 readonly로 선언하는 것이 좋다. readonly 매개변수는 인터페이스를 명확하게 하며, 매개변수가 변경되는 것을 방지하여 변경으로 인한 오류를 쉽게 찾을 수 있다. 하지만 readonly는 얕게(shallow) 동작하므로 깊은 readonly가 필요한 경우 라이브러리를 사용하거나 직접 구현해야 한다.

자세한 내용

readonly 배열의 특징

서브타입 관계

number[]readonly number[]보다 기능이 많으므로, readonly number[]의 서브타입이다. 따라서 변경 가능한 배열을 readonly 배열에 할당할 수 있지만, 그 반대는 불가능하다.

readonly 사용의 장점

  1. 타입스크립트가 매개변수 변경을 체크
  2. 호출하는 쪽에서 함수가 매개변수를 변경하지 않는다는 보장
  3. 호출하는 쪽에서 readonly 배열을 매개변수로 전달 가능

readonly 사용의 단점

호출하는 다른 함수도 readonly로 만들어야 할 수 있다. 하지만 이는 인터페이스를 명확히 하고 타입 안정성을 높이므로 꼭 단점이라고 볼 순 없다.

readonly의 얕은 동작

readonly는 얕게(shallow) 동작하므로, 객체의 readonly 배열이 있다면 객체 자체는 변경될 수 있다. 깊은(deep) readonly가 필요하면 ts-essentials의 DeepReadonly 같은 라이브러리를 사용한다.