TypeScript에서 읽기 전용 property를 만들면서 조사한 readonly keyword 내용을 정리해보았다.
(1) class
class Test {
private readonly prop1: number = 1;
private readonly prop2: number;
constructor() {
this.prop2 = 2;
}
fun() {
this.prop1 = 3; // Error! read-only property므로 변경이 불가능
}
}
(2) interface
interface Test {
readonly prop: number;
}
let test: Test = { prop: 5 };
console.log(test.prop); // 5
test.prop = 3; // Error! read-only property므로 변경이 불가능
// index signature에도 적용 가능
interface Test2 {
readonly[key: number]: number;
}
let test2: Test2 = { 0: 1, 1: 2 };
console.log(test2[0]); // 1
test2[0] = 3; // Error! read-only property므로 변경이 불가능
(3) Readonly
interface Test {
prop: number;
}
type readonlyTest = Readonly<Test>;
JavaScript에서는 어떻게?
Object.defineProperty로 property 생성할 때 writable property를 false로 준다고 한다.
ex)var test = {}; Object.defineProperty(test, "prop", { // ... writable: false });
class Test {
private otherProp: number;
constructor() {
this.otherProp = 0;
}
public setValue(value: number) {
this.otherProp = value;
}
get prop(): number {
return this.otherProp;
}
}
const test = new Test();
console.log(test.prop);
test.setValue(54);
console.log(test.prop);