Можно ли использовать геттеры / сеттеры в определении интерфейса?

голоса
50

На данный момент, TypeScriptне позволяет использовать получить / установить методы (Accessors) в интерфейсах. Например:

interface I {
      get name():string;
}

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

Кроме того, машинопись не позволяет использовать массив Function Expression в методах класса: напр .:

class C {
    private _name:string;

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

Есть ли другой способ, которым я могу использовать поглотитель и сеттер на определении интерфейса?

Задан 11/10/2012 в 12:15
источник пользователем
На других языках...                            


4 ответов

голоса
68

Вы можете указать свойство на интерфейсе, но вы не можете применять ли используются методы получения и установки, как это:

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 {
    // this satisfies the interface just the same
    public Name: string = "Bob";
}

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

И , наконец, =>не допускается для методов класса - вы могли бы начать обсуждение Codeplex , если вы думаете , есть горящий вариант использования для него. Вот пример:

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

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

    // No
    get name() => 'Steve';
}
Ответил 11/10/2012 в 13:03
источник пользователем

голоса
16

Для того, чтобы дополнить другие ответы, если ваше желание , чтобы определить get valueна интерфейсе, вы можете сделать это:

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");
  }
}

Не рекомендуется практика ; но вариант.

Ответил 13/12/2016 в 11:32
источник пользователем

голоса
2

Прежде всего, Машинопись только поддерживает getи setсинтаксис , когда ориентируетесь ECMAScript 5. Для достижения этой цели, вы должны вызвать компилятор с

tsc --target ES5

Интерфейсы не поддерживают методы получения и установки. Для того, чтобы получить код для компиляции вы должны изменить его

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в конструкторе.

Как Sohnee указывает, интерфейс на самом деле должен скрыть любые детали реализации. В моем примере я выбрал интерфейс требовать метода получения Java-стиль. Тем не менее, вы можете также свойство, а затем пусть класс решать, как реализовать интерфейс.

Ответил 11/10/2012 в 12:45
источник пользователем

голоса
0

Использование машинописи 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());

Смотрите пример на машинопись Playground .

Ответил 25/05/2019 в 17:30
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more