programing

인터페이스 정의에서 getters/setters를 사용할 수 있습니까?

lastmoon 2023. 2. 26. 10:27
반응형

인터페이스 정의에서 getters/setters를 사용할 수 있습니까?

그 순간.TypeScript그럼 인터페이스에서 get/set 메서드(액세서)를 사용할 수 없습니다.예를 들어 다음과 같습니다.

interface I {
      get name():string;
}

class C implements I {
      get name():string {
          return null;
      } 
}

또한 TypeScript에서는 클래스 메서드에서 Array Function Expression을 사용할 수 없습니다.

class C {
    private _name:string;

    get name():string => this._name;
}

인터페이스 정의에서 getter와 setter를 사용할 수 있는 다른 방법이 있나요?

인터페이스에서 속성을 지정할 수 있지만 다음과 같이 getter와 setter의 사용 여부를 강제할 수 없습니다.

interface IExample {
    Name: string;
}

class Example implements IExample {
    private _name: string = "Bob";

    public get Name() {
        return this._name;
    }

    public set Name(value) {
        this._name = value;
    }
}

var example = new Example();
alert(example.Name);

이 예에서는, 인터페이스가 클래스에 getters와 setters를 사용하도록 강제하는 것이 아니고, 대신에 속성을 사용할 수도 있었습니다(아래의 예). 그러나 인터페이스는 호출할 수 있는 것에 대한 발신 코드에 대한 약속이기 때문에, 어쨌든 이러한 실장의 상세를 숨기도록 되어 있습니다.

interface IExample {
    Name: string;
}

class Example implements IExample {
    // this satisfies the interface just the same
    public Name: string = "Bob";
}

var example = new Example();
alert(example.Name);

그리고 마지막으로=>는 클래스 메서드에서는 허용되지 않습니다.Codeplex에 대한 자세한 내용은 Codeplex에 대한 논의를 시작할 수 있습니다.다음은 예를 제시하겠습니다.

class Test {
    // Yes
    getName = () => 'Steve';

    // No
    getName() => 'Steve';

    // No
    get name() => 'Steve';
}

다른 답을 보충하기 위해, 만약 당신이 원하는 것이 정의된다면,get value인터페이스 상에서는readonly:

interface Foo {
  readonly value: number;
}

let foo: Foo = { value: 10 };

foo.value = 20; //error

class Bar implements Foo {
  get value() {
    return 10;
  }
}

하지만 제가 아는 한, 그리고 다른 사람들이 언급했듯이, 현재 인터페이스에서 set-only 속성을 정의할 방법은 없습니다.그러나 런타임 오류로 제한을 이동할 수 있습니다(개발 주기 동안에만 유용).

interface Foo {
  /* Set Only! */
  value: number;
}

class Bar implements Foo {
  _value:number;
  set value(value: number) {
    this._value = value;
  }
  get value() {
    throw Error("Not Supported Exception");
  }
}

권장 프랙티스는 아니지만 옵션입니다.

우선, Typescript는 다음을 지원합니다.get그리고.setEcmascript 5를 대상으로 할 때 구문을 지정합니다.이를 위해서는 컴파일러에 문의해야 합니다.

tsc --target ES5

인터페이스는 getter 및 setter를 지원하지 않습니다.컴파일하기 위해 코드를 다음과 같이 변경해야 합니다.

interface I { 
    getName():string;
}

class C implements I { 
    getName():string {
          return null;
    }   
}

에서 지원되는 typescript는 컨스트럭터의 필드에 대한 특별한 구문입니다.당신 같은 경우에는,

interface I {
    getName():string;
}

class C implements I {
    constructor(public name: string) {
    }
    getName():string {
        return name;
    }
}

클래스 주의C는 필드를 지정하지 않습니다.name통사설탕을 사용하여 실제로 선언된다.public name: string컨스트럭터 안에 있습니다.

Sohnee가 지적한 바와 같이 인터페이스는 실제로 구현의 세부사항을 숨깁니다.이 예에서는 Java 스타일의 getter 메서드를 필요로 하는 인터페이스를 선택했습니다.다만, 속성을 지정하고 나서, 클래스의 인터페이스 실장 방법을 결정하게 할 수 있습니다.

TypeScript 3.4 사용:

interface IPart {
    getQuantity(): number;
}

class Part implements IPart {
    private quantity: number;
    constructor(quantity: number) {
        this.quantity = quantity;
    }
    public getQuantity = (): number => {
        return this.quantity;
    };
}

let part = new Part(42);

// When used in typescript, quantity is not accessible.
// However, when compiled to javascript it will log '42'.
console.log(part.quantity);

// Logs '42'.
console.log(part.getQuantity());

TypeScript Playground의 예를 참조하십시오.

언급URL : https://stackoverflow.com/questions/12838248/is-it-possible-to-use-getters-setters-in-interface-definition

반응형