Typescript avancé avec instance (Partie 2)

Il est temps de continuer (et de terminer) notre tutoriel Typescript. avez manqué notre article précédent sur Typescript, voici notre introduction initiale à Typescript et la première partie de ce tutoriel, où je vais expliquer lamp;rsquoexemple de JavaScript que nous utilisons et les étapes que nous avons prises pour lamp;rsquoaméliorer partiellement. Aujourdamp;rsquohui, nous compléterons notre exemple en remplissant tout ce qui manque encore. En particulier, nous verrons damp;rsquoabord comment créer des versions partielles de types damp;rsquoautres types existants. Ensuite, nous verrons comment taper correctement le partage du stockage Redux en utilisant la Fédération de type, et nous discuterons des avantages de la Fédération de type. Enfin, je vais montrer comment créer une fonction polymorphe dont le type de retour dépend de ses paramètres.
Un bref aperçu de ce que nous avons fait jusquamp;rsquoà présent Dans la première partie de ce tutoriel, nous avons utilisé comme exemple de travail une partie du magasin Redux extrait de nelio content. Tout commence avec un code JavaScript simple qui doit être amélioré en ajoutant des types spécifiques pour le rendre plus robuste et compréhensible. Par exemple, nous définissons les types suivants: type postId = nombre Type day = String Type post = {id: postId title: String Author: String Day: Day status: String isssticky: Boolean} Type status = {Post: dictionary Jours: dictionnaire } Cela nous aide à comprendre en un coup damp;rsquooeil le type damp;rsquoinformation utilisée dans nos magasins. Par exemple, dans ce cas particulier, nous pouvons voir que lamp;rsquoétat de lamp;rsquoapplication stocke deux choses: une liste de messages (que nous indexerons par lamp;rsquoID du message) et une structure appelée jours, qui renvoie une liste damp;rsquoidentificateurs de messages un jour donné. Nous pouvons également voir les propriétés (et leurs types spécifiques) qui se trouvent dans lamp;rsquoobjet post.
Une fois ces types définis, nous modifions toutes les fonctions de lamp;rsquoexemple
Ils vont samp;rsquoen sortir. Cette tâche simple convertit les signatures de la fonction damp;rsquoopacité javascript: selectors Function getpost (State, id) {} Fonction getpostsinday (State, Day) {} Fonction damp;rsquoaction receivenewpost (Post) {} Fonction updatepost (postId, attributes) {} Réduire la fonction réduire (état, action) {} gnature de la fonction de script damp;rsquointerprétation automatique: fonction de sélection getpost (état, id: postId): Post | not defined {} Fonction getpostsinday (Status: State, Day: Day): postId [] {} Action Function receivenewpost (Post: Post): any {} Fonction updatepost (postId: postId, attribut: any): any {} Reduce Function Reducer (Status: State, action: any): Status {} La fonction getpostsinday est un bon exemple de la façon dont Typescript peut améliorer la qualité du Code. regardez les correspondances Javascript, ne savez vraiment pas ce que la fonction retournera. Bien sûr, son nom peut suggérer le type de résultat (peut être une liste de messages?), Mais devez examiner le code source de la fonction (qui peut également inclure des actions et des simplificateurs) pour être sûr (En fait, il samp;rsquoagit damp;rsquoune liste damp;rsquoidentification de message). Vous pouvez améliorer cette situation en nommant mieux les choses (par exemple getidsofpostsinday), mais rien namp;rsquoélimine plus le doute que le type spécifique: postId [].
Donc, maintenant que avez compris la situation actuelle, il est temps damp;rsquoaller de lamp;rsquoavant et de réparer tout ce que nous avons manqué la semaine dernière. En particulier, nous savons que devez saisir les propriétés de la propriété de la fonction updatepost et que devez définir le type damp;rsquoaction qui aura notre action (Notez que dans reducer, la propriété damp;rsquoaction est namp;rsquoimporte quel type à ce stade). Comment taper un objet qui est un sous ensemble damp;rsquoun autre objet nous permet de commencer par des choses simples. La fonction updatepost génère une action indiquant que nous avons lamp;rsquointention de mettre à jour un
Titre de la carte damp;rsquoidentité de naissance. Voici à quoi il ressemble:
Fonction updatepost (postId: postId, attributes: any): any {return {type: amp;lsquoUpdate _ postamp;rsquo, postId, Attributes,}} Voici comment Reducer utilise les actions pour mettre à jour les messages dans notre magasin: fonction Reducer (Status: State, action: any): Status { Switch (action.type) { Case
Mais quels sont les attributs spécifiques damp;rsquoune action? De toute évidence, ils ressemblent à des messages parce quamp;rsquoils devraient écraser les attributs que nous pourrions trouver dans les messages: type Update = {type: amp;lsquoUpdate _ postamp;rsquo postId: number attributes: Post} Mais si nous essayons de lamp;rsquoutiliser, nous trouvons quamp;rsquoil ne fonctionne pas: Const Post: Post = {id: 1, Title: amp;lsquotitleamp;rsquo, Author: amp;lsquoRuthamp;rsquo, Day: amp;lsquo2020 10 01amp;rsquo, Status: amp;lsquoDraftamp;rsquo, isssticky: false,} Action constante: mise à jour = {type: amp;lsquoUpdate _ postamp;rsquo, postId: 1, attribut: {by: amp;lsquoToniamp;rsquo,},} Parce que nous ne voulons pas que lamp;rsquoattribut lui même soit un poste Nous voulons quamp;rsquoil samp;rsquoagisse damp;rsquoun sous ensemble des attributs Post (camp;rsquoest à dire que nous ne voulons spécifier que les attributs de lamp;rsquoobjet post à écraser).
Pour résoudre ce problème, utilisez le type damp;rsquoutilitaire partial: type Update = {type: amp;lsquoUpdate _ postamp;rsquo postId: number attributes: Partial } Camp;rsquoest tout! Ou alors? Il y a encore des erreurs dans le filtrage des propriétés explicites des fragments de code précédents parce que pouvez obtenir des erreurs damp;rsquoexécution non testées par le compilateur de Typescript. Camp;rsquoest pourquoi: lamp;rsquoopération de déclaration des mises à jour post a deux paramètres, un ID Post et un ensemble de propriétés que nous voulons mettre à jour. Une fois que nous serons prêts à agir, le réducteur samp;rsquoen occupera.
écraser les messages existants avec de nouvelles valeurs:
Objet du message: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re Camp;rsquoest la partie défectueuse de notre Code Lamp;rsquoattribut postId de lamp;rsquoopération peut avoir un ID pots X, et lamp;rsquoattribut ID dans lamp;rsquoattribut a un ID post différent y: Const action: updateportaction = {type: amp;lsquoUpdate _ postamp;rsquo, postId: 1, attribut: {id: 2, Author: amp;lsquoToniamp;rsquo,},},} Il samp;rsquoagit évidemment damp;rsquoune opération valide, de sorte que Typescript ne déclenche aucune erreur, mais nous savons quamp;rsquoil ne devrait pas déclencher damp;rsquoerreurs. Lamp;rsquoattribut ID et lamp;rsquoattribut posid dans les attributs (le cas échéant) doivent avoir la même valeur, sinon notre opération namp;rsquoest pas cohérente. Notre type damp;rsquoaction est inexact, car il nous permet de définir une situation impossible Comment résoudre ce problème? Camp;rsquoest très simple: il suffit de changer ce type pour rendre pratiquement impossible une scène autrement impossible.
La première solution à laquelle je pense est de supprimer lamp;rsquoattribut posid de lamp;rsquoopération et damp;rsquoajouter lamp;rsquoattribut id: type Update = {type: amp;lsquoUpdate _ postamp;rsquo attribut: Partial } Fonction updatepost (postId: postId, attribut: Partial ): Mise à jour {renvoie {type: amp;lsquoUpdate _ postamp;rsquo, attributs: {attributs, id: postId,},}} Ensuite, mettez à jour la transmission pour quamp;rsquoelle fonctionne. Propriétés. ID au lieu de lamp;rsquoopération. PostId trouve et écrase les messages existants. Malheureusement, cette solution namp;rsquoest pas idéale parce que la propriété est
Be:
Const Working action: update = {type: amp;lsquoUpdate _ postamp;rsquo, Property: {id: 1, Author: amp;lsquoToniamp;rsquo,},} Const failinaction: update = {type: amp;lsquoUpdate _ postamp;rsquo, attribut: {Author: amp;lsquoToniamp;rsquo,},} Par conséquent, si nous voulons que Typescript nous protège, nous devons spécifier les types aussi précisément que possible et nous assurer quamp;rsquoils produisent des états impossibles. Compte tenu de tout cela, nous namp;rsquoavons que deux options disponibles: si nous avons un attribut postId (comme nous lamp;rsquoavons fait au début), lamp;rsquoobjet attributs ne peut pas contenir lamp;rsquoattribut Id. Damp;rsquoautre part, si lamp;rsquoopération namp;rsquoa pas damp;rsquoattribut postId, lamp;rsquoattribut doit contenir lamp;rsquoattribut Id. La première solution peut être facilement spécifiée en utilisant un autre type damp;rsquoutilitaire, omit, qui nous permet de créer de nouveaux types en supprimant les attributs des types existants:
Type Update = {type: amp;lsquoUpdate _ postamp;rsquo postId: postId, attribut: Partial amp;lt Omit amp;gt } Travailler comme prévu: Const Working action: update = {type: amp;lsquoUpdate _ postamp;rsquo, postId: 1, attributes: {Author: amp;lsquoToniamp;rsquo},} Const failingaction: updateposition = {type: amp;lsquoUpdate _ postamp;rsquo, postId: 1, Property: {id: 1, Author: amp;lsquoToniamp;rsquo},} Pour la deuxième option, nous devons explicitement ajouter lamp;rsquoattribut ID au dessus du type partiel Nous avons défini: Type Update = {type: amp;lsquoUpdate _ postamp;rsquo Properties: part amp;amp {id: postId}} Ceci donne une fois de plus les résultats attendus: Const Working action: update = {type: amp;lsquoUpdate _ postamp;rsquo, attributs: {id: 1, Author: amp;lsquoToniamp;rsquo,},} Const failinaction: update = {type: amp;lsquoUpdate _ postamp;rsquo, attribut: {Author: amp;lsquoToniamp;rsquo,},} Dans la section précédente, nous avons vu comment taper lamp;rsquoune des deux opérations du magasin. Faisons de même pour la deuxième action. Sachez que receivenewpost est comme suit: fonction receivenewpost (Post: Post): tout {renvoie {type: amp;lsquoreceive _ new postamp;rsquo, Post,}} Les types peuvent être
Séparer un homme damp;rsquoun autre. Dans notre exemple, les deux types damp;rsquoopérations ont une propriété de type avec les valeurs receive _ New Post et updatepost pour la mise à jour de receivenewpostaction. Parce que nous savons que lamp;rsquoaction doit être une action ou un exemple damp;rsquoune autre action, les deux branches de lamp;rsquointerrupteur couvrent toutes les possibilités: ou lamp;rsquoaction. Le type est receive _ new post ou update post. Par conséquent, le retour final est redondant et inaccessible. Supposons donc que le retour soit supprimé pour corriger cette erreur. Y a t il autre chose que de supprimer le Code inutile? La réponse est oui. nous ajoutons maintenant un nouveau type damp;rsquoaction au Code: action de type = | updateaction | receivenewpostaction | newfeatureaction Tapez newfeatureaction = {type: amp;lsquoNew Featuresamp;rsquo } Soudain, lamp;rsquoinstruction Switch dans notre réducteur ne couvre plus tous les scénarios possibles: réducteur de fonctions (état: état, action: action): état { Switch (action.type) {cas
Ce que jamp;rsquoa I est getpostsinday, dont le type de retour est une liste damp;rsquoidentification, Post: function getpostsinday (State: State, Day: Day): postId [] {return status. Days [Day]? []] Même si le nom indique quamp;rsquoil peut renvoyer une liste de messages. Vous demandez pourquoi jamp;rsquoutilise un nom aussi trompeur? Imaginez le scénario suivant: supposons que vouliez que cette fonction renvoie une liste damp;rsquoid de poste ou une liste de postes réels, selon la valeur damp;rsquoun de ses paramètres. Un contenu similaire: Const id: postId [] = getpostsinday (amp;lsquo2020 10 01amp;rsquo, amp;lsquoidamp;rsquo) Post Post Post: post [] = getpostsinday (amp;lsquo2020 10 01amp;rsquo, amp;lsquoallamp;rsquo) Pouvons nous le faire dans Typescript? Bien sûr que si! non, pourquoi devrais je poser cette question? Tout ce que nous avons à faire est de définir une fonction polymorphe dont le résultat dépend des paramètres damp;rsquoentrée. Donc, nous voulons deux versions différentes de la même fonctionnalité. lamp;rsquoun des attributs est un ID de chaîne, une liste de postId doit être retournée. la même propriété est string all, lamp;rsquoautre propriété doit renvoyer la liste des messages. Créez les: fonction getpostsinday (Status: State, Day: Day, mode:
Augmentez la qualité de votre travail à un nouveau niveau. Bonne chance dans cette nouvelle aventure! Photo de Mike kenneally sur unsplash.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

ContactPress Supported By WordPress Plugins