TypeScript 에는 타입을 읽기 전용으로 만들어주는 타입 시스템이 있다.
type ObjectType = {
property1: number;
readonly property2: number;
};
const object: ObjectType = {
property1: 1,
property2: 2,
};
object.property1 = 11;
object.property2 = 22; // 에러 발생
이런 식으로 말이다.
type ObjectType = Readonly<{
property1: number;
property2: number;
}>;
const object: ObjectType = {
property1: 1,
property2: 2,
};
object.property1 = 11; // 에러 발생
object.property2 = 22; // 에러 발생
모든 속성에 대해 읽기 전용으로 만드는 방식은 Readonly 타입을 사용하면 된다.
하지만 중첩된 구조를 가진 Object 일 경우는 어떻게 될까?
type ObjectType = Readonly<{
property1: number;
property2: {
property2a: number;
property2b: number;
};
}>;
const object: ObjectType = {
property1: 1,
property2: {
property2a: 21,
property2b: 22,
},
};
object.property1 = 11; // 에러 발생
object.property2.property2a = 221;
object.property2.property2b = 222;
Readonly 타입을 사용해도 재귀적으로 읽기 전용 속성이 지정되지 않는다.
https://stackoverflow.com/questions/41879327/deepreadonly-object-typescript
역시 구글과 스택 오버플로우에는 없는 게 없다.
// @types/global.d.ts
export { global };
declare global {
type DeepReadonly<T> = T extends (infer R)[]
? DeepReadonlyArray<R>
: T extends object
? DeepReadonlyObject<T>
: T;
interface DeepReadonlyArray<T> extends ReadonlyArray<DeepReadonly<T>> {}
type DeepReadonlyObject<T> = {
readonly [P in keyof T]: DeepReadonly<T[P]>;
};
}
DeepReadonly 같이 재귀적인 읽기 전용 속성을 하나 만들어 두면 된다.
type ObjectType = DeepReadonly<{
property1: number;
property2: {
property2a: number;
property2b: number;
};
}>;
const object: ObjectType = {
property1: 1,
property2: {
property2a: 21,
property2b: 22,
},
};
object.property1 = 11; // 에러 발생
object.property2.property2a = 221; // 에러 발생
object.property2.property2b = 222; // 에러 발생
중첩된 구조의 config 파일 등을 유지 보수할 때 아주 유용하다.
항상 구글에 감사하십시오. 휴먼.
'개발 > Front-End' 카테고리의 다른 글
네이버 공식 웹폰트 사용법 - 나눔, 마루 부리, 클로바 글꼴 (0) | 2022.08.18 |
---|---|
[VS Code] Version Lens - package.json 버전 확인 (0) | 2022.08.09 |
SASS 에서 이미지 크기 가져오기 (0) | 2022.07.21 |
Tip: VS Code 에서 이미지 크기 자동 입력하기. (0) | 2022.07.05 |
Vue 3 Props 사용법 정리 - feat. setup (0) | 2022.07.01 |