Nice programing

개인 세터 타이프 스크립트?

nicepro 2020. 12. 5. 10:40
반응형

개인 세터 타이프 스크립트?


TypeScript에서 속성에 대한 private setter를 갖는 방법이 있습니까?

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에 게터가 있는지 여부가 아닌 속성 만 정의 할 수 있습니다.

여기에 뭔가 빠졌나요? private setter를 허용하지 않을 이유가없는 것 같고 결과 JS는 어쨌든 가시성을 강제하지 않으며 현재 대안보다 더 나은 것 같습니다.

내가 뭔가를 놓치고 있습니까? 그렇지 않다면 개인 세터가없는 이유가 있습니까?


TypeScript 사양 (8.4.3)에 따르면 ...

동일한 멤버 이름의 접근자는 동일한 접근성을 지정해야합니다.

따라서 적절한 대안을 선택해야합니다. 다음은 두 가지 옵션입니다.

setter를 가질 수 없습니다. 즉, 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!';

아마도 "notify property changed"패턴과 유사한 것을 구현할 수있는 private access 결과를 보장하는 이상적인 방법은 한 쌍의 private get / set 속성 접근 자와 별도의 public get 속성 접근자를 갖는 것입니다.

나중에 누군가 지원 필드에 직접 통화를 추가하는 것에 대해 여전히주의해야합니다. 그 영역에서 창의력을 발휘하여 가능성을 줄일 수 있습니다.

class Test
{
    private _nameBackingField: string;

    private get _name() : string
    {
        return this._nameBackingField;
    }

    private set _name(val: string)
    {
        this._nameBackingField = val;
        // other actions... notify the property has changed etc
    }

    public get name(): string {
        return this._name;
    }

    doSomething() {
        this._name += 'Additional Stuff';
    }
}

나는 또한 우리가 공개 getter와 private setter를 가질 수 있기를 바랍니다. 그렇게 할 때까지이를 처리하는 또 다른 방법은 추가 개인 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;
  }
}

참고URL : https://stackoverflow.com/questions/27825350/private-setter-typescript

반응형