Comment déclarer une variable de type A ou B quand on étend les autres en caractères d'imprimerie

0

La question

J'ai un contexte de fournisseur de flux de données de l'utilisateur tout au long de l'application.

J'ai un Étudiant de l'interface:

export interface Student extends User

Je voudrais que le prestataire de retour de l'utilisateur des données de type Student ou User comme suit:

let userData: Student | User = null;

Lorsque vous essayez d'accéder à une propriété uniquement disponible pour les étudiants, userData?.currentTeamVS Code génère l'erreur suivante:

Property 'currentTeam' does not exist on type 'Student | User'.
  Property 'currentTeam' does not exist on type 'User'.ts(2339)

J'ai besoin d'aide à trouver pourquoi il est en défaut à l'interface parent et comment donner la possibilité à la fois.

1

La meilleure réponse

1

C'est le comportement standard des syndicats: sauf si vous faites quelque chose pour vérifier quel type vous avez à traiter avec, la machine vous permettra seulement d'accéder à des propriétés qui existent sur tous les membres de l'union.

Voici quelques exemples de comment vous pouvez préciser le type. Vous pouvez vérifier si la propriété existe:

if ('currentTeam' in userData) {
  console.log(userData.currentTeam);
}

Ou si vous avez créé des classes (qui vous ne pouvez pas avoir), vous pouvez utiliser l'exemple de:

if (userData instanceof Student) {
  console.log(userData.currentTeam);
}

Ou, vous pouvez changer les types ils ont donc une propriété en commun, que vous pouvez ensuite vérifier pour voir quel type vous avez affaire. Cela est parfois appelé une "discrimination syndicale".

interface User {
  type: 'user',
  // rest of the type here
}

interface Student extends User {
  type: 'student',
  currentTeam: // something,
  // rest of the type here
}

if (userData.type === 'student') {
  console.log(userData.currentTeam);
}
2021-11-24 00:11:30

Je Vous Remercie. J'ai été en mesure d'utiliser cette option pour définir la valeur par défaut dans le champ de formulaire avec le ternaire: 'currentTeam' in userData ? userData.currentTeam.teamName: 'No Team Set'
Rafael Zasas

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................