인터페이스에 메소드만 선언할 수 있는 것이 아니며
멤버변수 또한 선언이 가능하다고 했습니다
근데 , 여기서 주의할 점이 있습니다
아래의 인터페이스가 있고 이걸 구현한다고 했을 때
interface test {
something: number;
print(): void;
}
우선 , 인터페이스에서는 유형의 구조 및 기능에만 관심이 있기 때문에 private같은 접근제어자를 사용하지 못 합니다
interface test {
private something: number; //error
print(): void;
}
그래서 만약 외부에서 읽기만 가능하고
수정만 막기 위함이 목적이라면 readonly를 사용합니다
interface test {
something: number;
print(): void;
}
class Testimpl implements test {
**readonly** something: number;
constructor(something: number) {
this.something = something;
}
print(): void {
console.log(this.something);
}
}
interface test {
something: number;
print(): void;
}
// 구현
class Testimpl implements test {
**//error**
private something: number;
constructor(something: number) {
this.something = something;
}
print(): void {
console.log(this.something);
}
}
test인터페이스의 something은
public
Testimpl 클래스의 something은private 그러므로 에러가 발생합니다
interface test {
something: number;
print(): void;
}
class Testimpl implements test {
// 언더바 사용
private _something: number;
constructor(something: number) {
this._something = something;
}
// getter 사용
get something() {
return this._something;
}
print(): void {
console.log(this._something);
}
}
const test = new Testimpl(10);
이 변수에 대한 getter를 따로 작성 해 주면 됩니다
이렇게 되면 에러를 막을 수 있습니다
💡 반드시 언더바 규약을 지켜야 합니다. 언더바 규약이 지켜지지 않으면 에러가 발생합니다
그리고 1번의 readonly만 사용해 버리면,
구현하는 클래스 내부에서도 변수의 값을 못 바꿔주게 됩니다
그래서 이렇게 readonly + private을 같이 사용해도 됩니다
interface test {
**readonly** something: number;
print(): void;
}
class Testimpl implements test {
// 언더바 사용
**private** _something: number;
constructor(something: number) {
this._something = something;
}
**// getter 사용**
get something() {
return this._something;
}
print(): void {
console.log(this._something);
}
}
const test = new Testimpl(10);
출처
Property is private in type 'X' but not in type 'Y' in TS | bobbyhadz