2015-01-07 2 views
32

TypeScript의 속성에 전용 설정기를 사용할 수 있습니까?개인 설정 기 typescript?

class Test 
{ 
    private _prop: string; 
    public get prop() : string 
    { 
     return this._prop; 
    } 

    private set prop(val: string) 
    { 
     //can put breakpoints here 
     this._prop = val; 
    } 
} 

컴파일러는 getter 및 setter에 대한 가시성이 일치하지 않는다고 불평합니다. 내가 뒷받침 필드를 설정할 수는 있지만 값이 설정되면 중단 점을 설정할 수 없다는 것을 알고 있습니다.

인터페이스를 사용하여 setter를 숨길 수 있지만 인터페이스는 속성을 정의 할 수 있으며 setter에 getter가 있는지 여부가 아닙니다.

여기에 뭔가가 있습니까? 프라이빗 세터를 허용하지 않는 이유가없는 것 같지만 결과 JS는 어쨌든 가시성을 강화하지 않으며 현재 대안을 더 잘 보인다.

내가 누락 된 항목이 있습니까? 그렇지 않다면 개인 설정자가없는 이유가 있습니까?

답변

30

타이프 스크립트 사양 (8.4.3)을 말한다 ... 같은 멤버 이름에 대한

접근자는 그래서 당신은 적절한 대안을 선택해야 같은 접근성

를 지정해야합니다. 다음 두 가지 옵션을 사용할 수 있습니다.

설정자가 없으므로 Test 클래스 만 속성을 설정할 수 있습니다. 줄에 this._prop =...에 중단 점을 배치 할 수 있습니다.

class Test 
{ 
    private _prop: string; 
    public get prop() : string 
    { 
     return this._prop; 
    } 

    doSomething() { 
     this._prop = 'I can set it!'; 
    } 
} 

var test = new Test(); 

test._prop = 'I cannot!'; 

"알림 변경 속성"메커니즘을 구현하려는 경우 개인 방법을 사용할 수 있습니다.

class Test 
{ 
    private _prop: string; 
    public get prop() : string 
    { 
     return this._prop; 
    } 

    private setProp(value: string) { 
     this._prop = value; 
     //notify('_prop', value); 
    } 

    doSomething() { 
     this.setProp('I can set it!'); 
    } 
} 

var test = new Test(); 

test.setProp('I cannot!'); 
+2

이 솔루션의 문제점은 + = (및 - =) 연산자를 허용하지 않는다는 것입니다 : this.prop + = 'abc';' – splintor

+0

@splintor 네,하지만 다른 사람들이 값을 바꾸도록 내버려 두지는 않습니다. –

+0

@TobyJ 샘플에 사용 된'this'에 주목하십시오. 클래스 내에서 중단 점을 설정할 수있는'+ ='및'- ='를 허용하는 것을 의미합니다. @Fenton 솔루션은 메소드 추가를 제안하지만 클래스 내에서'+ ='를 사용하여'prop'에 추가 할 수 없습니다. 방법은 [my solution] (https://stackoverflow.com/a/45909300/46635)을 참조하십시오. – splintor

1

또한 공개 getter 및 개인 설정기를 사용할 수 있기를 바랍니다. 우리가 할 때까지 이것을 처리하는 또 다른 방법은 private getter와 setter를 추가하는 것입니다 :

class Test { 
    _prop: string; 
    public get prop(): string { 
    return this._prop; 
    } 

    private get internalProp(): string { 
    return this.prop; 
    } 

    private set internalProp(value: string) { 
    this._prop = value; 
    } 

    private addToProp(valueToAdd: string): void { 
    this.internalProp += valueToAdd; 
    } 
}