Вы можете указать свойство в интерфейсе, но не можете указать, используются ли геттеры и сеттеры, например:
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);
В этом примере интерфейс не заставляет класс использовать геттеры и сеттеры, вместо этого я мог бы использовать свойство (пример ниже), но интерфейс должен все равно скрывать эти детали реализации, поскольку это обещание вызывающему коду о том, что это может назвать.
interface IExample {
Name: string;
}
class Example implements IExample {
public Name: string = "Bob";
}
var example = new Example();
alert(example.Name);
И, наконец, =>
это запрещено для методов класса - вы можете начать обсуждение Codeplex, если считаете, что для него существует актуальный вариант использования. Вот пример:
class Test {
getName = () => 'Steve';
getName() => 'Steve';
get name() => 'Steve';
}
=>
такие методы для определения класса:name = (a: string) => this._name;
но в выходном JS он будет определяться внутри функции класса, а не расширять его объект-прототип.В дополнение к другим ответам, если вы хотите определить a
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; } }
но, насколько мне известно, и, как упоминалось другими, в настоящее время нет способа определить свойство только для набора в интерфейсе. Однако вы можете переместить ограничение на ошибку времени выполнения (полезно только во время цикла разработки):
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"); } }
Не рекомендуемая практика ; но вариант.
источник
Прежде всего, Машинопись только поддерживает
get
иset
синтаксис , когда ориентируется ECMAScript 5. Для достижения этой цели, вы должны вызвать компилятор сИнтерфейсы не поддерживают геттеры и сеттеры. Чтобы ваш код скомпилировался, вам нужно будет изменить его на
interface I { getName():string; } class C implements I { getName():string { return null; } }
Машинопись поддерживает специальный синтаксис для полей в конструкторах. В вашем случае вы могли бы
interface I { getName():string; } class C implements I { constructor(public name: string) { } getName():string { return name; } }
Обратите внимание, как класс
C
не указывает полеname
. Фактически он объявляется с помощью синтаксического сахараpublic name: string
в конструкторе.Как указывает Сохни, интерфейс должен скрывать любые детали реализации. В моем примере я выбрал интерфейс, требующий метода получения в стиле Java. Однако вы также можете задать свойство, а затем позволить классу решать, как реализовать интерфейс.
источник
get
иset
ключевые слова в машинописи.Object.defineProperty
поддерживается в IE8 +, FF4 +, Opera 12+, WebKit и Safari. Также на github.com/kriskowal/es5-shimИспользование 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 .
источник