0
votes

Propriétés inconnues utilisant l'héritage

en angulaire et dactylography, j'ai une interface xxx

maintenant deux autres interfaces, qui hérité de celle-ci: xxx

maintenant comment faire J'y vais à ce sujet, lors de l'utilisation d'une entrée dans un composant angulaire: xxx

donc avec cela, je me soucie si je reçois un objet B ou C, Il doit être de type A. Mais cela conduira à des erreurs une fois que j'appelle xxx

à cause de l'année de chaque année n'existe pas sur des objets de type A uniquement sur le type B.

Je vois que je peux faire: xxx

mais cela semble faux et ne fonctionne pas. N'y a-t-il pas une manière plus générique d'utiliser l'héritage?


3 commentaires

" Donc, avec cela, je dis que je m'en fiche si j'obtiens l'objet B ou C, il doit être de type A " alors pourquoi appelez-vous obj.year Si cela ne sera disponible que sur B? Cela suggère que vous attendez un type B.


Si vous voulez faire des trucs de manière conditionnelle sur B Type d'objets dans une fonction qui prend a | b , check Out TypeGuards.


@Vlaz Eh bien, j'ai déjà vérifié, alors cela ne fait que être exécuté, quand c'est B. Je ne me sépare pas de les séparer dans deux composants différents.


4 Réponses :


0
votes

Les types de syndicats sont le meilleur moyen de le faire, si vous vous attendez à obj pour être juste de types b ou c . Utilisation de A signifie que l'objet pourrait être de type a ou tout sous-type (dont il y a une infinité, pas seulement B ou c )

héritage ici vous aide à hériter toutes les propriétés de a dans b et c , c'est là que l'utilité se termine.

en utilisant B | C vous permet également d'utiliser des gardes de type pour accéder aux propriétés qui ne sont pas communes aux deux B et c (Vous ne pouvez pas accéder à des champs spécifiques par défaut, sauf si Vous effectuez une sorte de chèque pour voir ce qui est réellement dans obj au moment de l'exécution): xxx

Lire


3 commentaires

@ user5417542 J'ai ajouté un exemple de terrain de jeu complet, laissez-moi savoir ce qui ne fonctionne pas pour vous


Vous devrez peut-être utiliser this.OBJ ['année'] pour éviter l'erreur de compilation.


@Connorsfan non sous noimeplictany , et je ne le recommande pas vraiment. Vous venez de contourner le système de type, de ne pas l'utiliser, car quelque chose qui est un cas d'utilisation commun avec un motif de TS commun.



0
votes

Si vous souhaitez que l'entrée soit utilisée soit B OR, vous pouvez également ajouter un argument générique à la classe. Vous pouvez utiliser le parent A pour ajouter une restriction sur la classe


0 commentaires

0
votes

Vous pouvez garder votre entrée de même type que possible, mais lorsque vous l'utilisez, vous pouvez utiliser la coulée de type. Vous pouvez faire quelque chose comme ceci: xxx

Il ne se plaingera plus.


0 commentaires

0
votes

Si vous utilisez une interface d avec les deux propriétés, définissez-les uniquement en option.

export interface A {
  name: string;
}

export interface D extends A {
  year?: number;
  place?: string;
}


0 commentaires