Vous pouvez spécifier la propriété sur l'interface, mais vous ne pouvez pas imposer si les getters et les setters sont utilisés, comme ceci:
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);
Dans cet exemple, l'interface ne force pas la classe à utiliser des getters et des setters, j'aurais pu utiliser une propriété à la place (exemple ci-dessous) - mais l'interface est censée masquer ces détails d'implémentation de toute façon car c'est une promesse au code appelant sur ce qu'il peut appeler.
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);
Enfin, =>
les méthodes de classe ne sont pas autorisées - vous pouvez lancer une discussion sur Codeplex si vous pensez qu'il existe un cas d'utilisation brûlant pour celui-ci. Voici un exemple:
class Test {
// Yes
getName = () => 'Steve';
// No
getName() => 'Steve';
// No
get name() => 'Steve';
}
=>
pour définir des méthodes de classe comme celle-ci:name = (a: string) => this._name;
mais dans le JS de sortie, elle sera définie dans la fonction de classe plutôt que d'étendre son objet prototype.Pour compléter les autres réponses, si votre désir est de définir un
get value
sur une interface, vous pouvez utiliserreadonly
:mais pour autant que je sache, et comme d'autres l'ont mentionné, il n'y a actuellement aucun moyen de définir une propriété définie uniquement dans l'interface. Vous pouvez, cependant, déplacer la limitation vers une erreur d'exécution (utile pendant le cycle de développement uniquement):
Pratique non recommandée ; mais une option.
la source
Tout d'abord, Typescript ne prend en charge
get
et laset
syntaxe que pour cibler Ecmascript 5. Pour ce faire, vous devez appeler le compilateur avecLes interfaces ne prennent pas en charge les getters et les setters. Pour obtenir votre code à compiler, vous devrez le changer en
Ce que dactylographié prend en charge, c'est une syntaxe spéciale pour les champs dans les constructeurs. Dans votre cas, vous pourriez avoir
Remarquez que la classe
C
ne spécifie pas le champname
. Il est en fait déclaré en utilisant du sucre syntaxiquepublic name: string
dans le constructeur.Comme le souligne Sohnee, l'interface est en fait censée cacher tous les détails d'implémentation. Dans mon exemple, j'ai choisi l'interface pour exiger une méthode getter de style java. Cependant, vous pouvez également créer une propriété, puis laisser la classe décider comment implémenter l'interface.
la source
get
-set
clés et dans TypeScript.Object.defineProperty
est prise en charge dans IE8 +, FF4 +, Opera 12+, WebKit et Safari. Il y a aussi une cale EC5 sur github.com/kriskowal/es5-shimEn utilisant TypeScript 3.4:
Voir l'exemple sur TypeScript Playground .
la source