JavaScript traditionnel utilise des fonctions et un héritage basé sur un prototype pour créer des composants réutilisables,
mais cela peut sembler un peu gênant pour les programmeurs plus à l'aise avec une approche orientée objet, dans laquelle les
classes héritent des fonctionnalités et les objets sont construits à partir de ces classes.ECMAScript 2015, également appelé ECMAScript 6, les programmeurs JavaScript pourront créer leurs applications
à l'aide de cette approche basée sur les classes orientée objet. Dans TypeScript, nous autorisons les développeurs à utiliser
maintenant ces techniques et à les compiler en JavaScript qui fonctionne sur tous les principaux navigateurs et plates-formes,
sans avoir à attendre la prochaine version de JavaScript.C# ou Java.
Nous déclarons une nouvelle classe Greeter.
Cette classe a trois membres : une propriété appelée greeting, un constructeur et une méthode greet.this au début.
Cela indique qu'il s'agit d'un accès membre.Greeter en utilisant new.
Cela appelle le constructeur que nous avons défini précédemment,
créant un nouvel objet avec la forme de Greeter et exécutant le constructeur pour l'initialiser.TypeScript, nous pouvons utiliser des modèles communs orientés objet.
L'un des modèles les plus fondamentaux de la programmation par classes est la possibilité d'étendre les classes existantes
pour en créer de nouvelles en utilisant l'héritage.Dog est une classe dérivée qui dérive de la classe de base Animal à l'aide du mot-clé extend.Dog étend les fonctionnalités de Animal, nous avons pu créer une instance de Dog pouvant bark() et move().extend utilisés pour créer deux nouvelles sous-classes de Animal, Horse et Snake.super() qui
exécutera le constructeur de la classe de base. De plus, avant d'accéder à une propriété dans un corps de constructeur, nous devons appeler super().
Il s'agit d'une règle importante que TypeScript appliquera.Snake et Horse créent tous deux une méthode de déplacement qui remplace le déplacement de Animal,
ce qui lui confère une fonctionnalité propre à chaque classe. Notez que même si tom est déclaré comme un Animal,
puisque sa valeur est un Horse, l'appel de tom.move(34) appellera la méthode prépondérante dans Horse :publicpublic pour accomplir cela; Par exemple, C# exige que chaque membre soit
explicitement étiqueté comme public pour être visible. Dans TypeScript, chaque membre est public par défaut.public explicitement.
Nous aurions pu écrire la classe Animal de la section précédente de la manière suivante :privateprivate, il est impossible d'y accéder de l'extérieur de la classe qui le contient.
Par exemple:TypeScript est un système de types structurel.
Lorsque nous comparons deux types différents, quelle que soit leur origine, si les types de tous les membres sont compatibles,
nous disons que les types eux-mêmes sont compatibles.private et protected nous traitons ces types différemment.
Pour que deux types soient considérés comme compatibles, si l'un d'eux a un membre private, l'autre doit avoir un membre
private issu de la même déclaration. La même chose s'applique aux membres protected.Animal et un Rhino, le Rhino étant une sous-classe de Animal.
Nous avons également une nouvelle classe Employee qui ressemble à Animal en termes de forme.
Nous créons certaines instances de ces classes et essayons ensuite de les assigner les unes aux autres pour voir ce qui va se passer.
Comme Animal et Rhino partagent le même aspect privé de la même déclaration de nom privé: string dans Animal, ils sont compatibles.
Cependant, ce n'est pas le cas pour l'employé.
Lorsque nous essayons d'affecter un Employee à un Animal,
nous obtenons une erreur indiquant que ces types ne sont pas compatibles.
Même si Employee a également un name private,
ce n'est pas celui que nous avons déclaré dans Animal.protectedprotected agit un peu comme le modificateur private,
à l'exception du fait que les membres déclarés protected sont également
accessibles dans les classes dérivées. Par exemple,Person, nous pouvons néanmoins l'utiliser à partir d'une
méthode d'instance de Employee, car Employee dérive de Person.protected.
Cela signifie que la classe ne peut pas être instanciée en dehors de la classe qui la contient, mais qu'elle peut être étendue. Par exemple,readonly.
Les propriétés en lecture seule doivent être initialisées lors de leur déclaration ou dans le constructeur.name de membre en lecture seule et un paramètre de constructeur theName
dans la classe Octopus, puis nous avons immédiatement défini name sur theName.
Cela s'avère être une pratique très courante.
Les propriétés des paramètres vous permettent de créer et d'initialiser un membre à un endroit.
Voici une nouvelle révision de la classe Octopus précédente utilisant une propriété de paramètre :theName et utilisons simplement le paramètre abrégé name: string du
constructeur pour créer et initialiser le name du membre. Nous avons regroupé les déclarations et les assignations en un seul emplacement.private pour une propriété de paramètre déclare et initialise un membre private de même,
la même chose est faite pour public, protected et readonly.TypeScript supporte les getters / setters comme moyen d'intercepter les accès à un membre d'un objet.
Cela vous donne un moyen d'avoir un contrôle plus fin sur la façon dont un membre est accédé sur chaque objet.get et set.
Tout d'abord, commençons par un exemple sans getters et setters.fullName est très pratique,
mais cela pourrait nous causer des problèmes si les gens pouvaient changer de name sur un coup de tête.Employee.
Nous faisons cela en remplaçant l'accès direct à fullName par un ensemble qui vérifie le code secret.
Nous ajoutons un get correspondant pour permettre à l'exemple précédent de continuer à fonctionner de manière transparente.Employee.ECMAScript 5 ou supérieure.
La réduction à ECMAScript 3 n'est pas prise en charge.
Deuxièmement, les accesseurs avec get et set sont automatiquement déduits d'être en lecture seule.
Ceci est utile lors de la génération d'un fichier .d.ts à partir de votre code,
car les utilisateurs de votre propriété peuvent voir qu'ils ne peuvent pas le modifier.static sur origine, car c'est une valeur générale pour toutes les Grid.
Chaque instance accéde à cette valeur en ajoutant le nom de la classe en préfixe.
De la même façon, avant this. devant les accés aux instances, nous précédons ici Grid devant des accés static.abstract sont des classes de base à partir desquelles d'autres classes peuvent être dérivées.
Ils ne peuvent pas être instanciés directement. Contrairement à une interface, une classe abstract peut contenir des détails d'implémentation pour ses membres.
Le mot clé abstract est utilisé pour définir des classes abstract ainsi que des méthodes abstract au sein d'une classe abstract.abstract marquées comme abstract ne contiennent pas d'implémentation et doivent être implémentées dans des classes dérivées.
Les méthodes abstract partagent une syntaxe similaire aux méthodes d'interface. Les deux définissent la signature d'une méthode sans inclure un corps de méthode.
Toutefois, les méthodes abstract doivent inclure le mot clé abstract et peuvent éventuellement inclure des modificateurs d'accès.TypeScript, vous créez plusieurs déclarations en même temps.
Le premier est le type de l'instance de la classe.greeter: Greeter, nous utilisons Greeter comme type d'instances de la classe Greeter.
C'est presque une seconde nature pour les programmeurs d'autres langages orientés objet.JavaScript créé par l'exemple ci-dessus:Greeter va se voir attribuer la fonction constructeur.
Lorsque nous appelons new et exécutons cette fonction, nous obtenons une instance de la classe.
La fonction constructeur contient également tous les membres static de la classe.
Une autre façon de penser à chaque classe est qu'il existe un côté instance et un côté static.greeter1 fonctionne de la même manière que précédemment.
Nous instancions la classe Greeter et utilisons cet objet.
Nous l'avons vu auparavant.greeterMaker.
Cette variable tiendra la classe elle-même, ou dit autrement sa fonction constructeur.
Ici, nous utilisons typeof Greeter, c'est-à-dire "donnez-moi le type de la classe Greeter elle-même" plutôt que le type d'instance.
Ou, plus précisément, "donnez-moi le type du symbole appelé Greeter", qui est le type de la fonction constructeur.
Ce type contiendra tous les membres static de Greeter ainsi que le constructeur qui crée des instances de la classe Greeter.
Nous montrons cela en utilisant new sur greeterMaker, en créant de nouvelles instances de Greeter et en les invoquant comme auparavant.