Você pode especificar a propriedade na interface, mas não pode impor se getters e setters são usados, como este:
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);
Neste exemplo, a interface não força a classe a usar getters e setters, eu poderia ter usado uma propriedade (exemplo abaixo) - mas a interface deve ocultar esses detalhes de implementação de qualquer maneira, pois é uma promessa para o código de chamada sobre o que pode chamar.
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);
E, por último, =>
não é permitido para métodos de classe - você pode iniciar uma discussão no Codeplex se achar que há um caso de uso ardente para ele. Aqui está um exemplo:
class Test {
// Yes
getName = () => 'Steve';
// No
getName() => 'Steve';
// No
get name() => 'Steve';
}
=>
para definir métodos de classe como este:name = (a: string) => this._name;
mas no JS de saída, ele será definido dentro da função de classe em vez de estender seu objeto de protótipo.Para complementar as outras respostas, se seu desejo é definir um
get value
em uma interface, você pode usarreadonly
:mas, tanto quanto eu sei, e como outros mencionaram, não há nenhuma maneira atualmente de definir uma propriedade apenas de conjunto na interface. Você pode, no entanto, mover a limitação para um erro de tempo de execução (útil apenas durante o ciclo de desenvolvimento):
Prática não recomendada ; mas uma opção.
fonte
Primeiro de tudo, Typescript só suporta
get
eset
sintaxe quando targetting ECMAScript 5. Para conseguir isso, você tem que chamar o compilador comAs interfaces não oferecem suporte a getters e setters. Para obter o seu código para compilar, você teria que alterá-lo para
O que o typescript suporta é uma sintaxe especial para campos em construtores. No seu caso, você poderia ter
Observe como a classe
C
não especifica o camponame
. Na verdade, é declarado usando açúcar sintáticopublic name: string
no construtor.Como Sohnee aponta, a interface deve, na verdade, ocultar quaisquer detalhes de implementação. No meu exemplo, escolhi a interface para exigir um método getter no estilo java. No entanto, você também pode definir uma propriedade e deixar a classe decidir como implementar a interface.
fonte
get
-set
chave e no TypeScript.Object.defineProperty
é compatível com IE8 +, FF4 +, Opera 12+, WebKit e Safari. Há também um EC5 Shim em github.com/kriskowal/es5-shimUsando TypeScript 3.4:
Veja o exemplo em TypeScript Playground .
fonte