인터페이스 정의에서 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
그리고.set
Ecmascript 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
'programing' 카테고리의 다른 글
MySQL(5.6) 열에 json 문서가 문자열로 포함된 경우 값을 가져오는 방법 (0) | 2023.02.26 |
---|---|
react use객체 비교 효과 (0) | 2023.02.26 |
AngularJs에서 정수를 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2023.02.26 |
Jackson의 역직렬화는 @Json Unwraped와 동등합니까? (0) | 2023.02.26 |
리액트 훅을 사용하여 소품을 상태와 동기화하는 방법: setState() (0) | 2023.02.26 |