Cum pentru a declara variabile de tip a sau B, atunci când unul se extinde la alte mașina de Scris

0

Problema

Am un context furnizor care fluxuri de date utilizator de-a lungul aplicația.

Am un Elev cu interfata:

export interface Student extends User

Aș dori furnizorul să se întoarcă de date de utilizator de tip Student sau User după cum urmează:

let userData: Student | User = null;

Când încercarea de a accesa o proprietate disponibila doar pentru studenți, userData?.currentTeam, VS Cod aruncă următoarea eroare:

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

Am nevoie de ajutor pentru a afla ce este în culpă la mamă interfață și cum, pentru a permite opțiunea de atât.

1

Cel mai bun răspuns

1

Acesta este un comportament standard de sindicate: dacă nu faci ceva pentru a verifica ce tip ai de-a face cu dactilografie, va permite doar vă pentru a accesa proprietățile care există pe toți membrii uniunii.

Aici sunt câteva exemple de cum se poate restrânge tip. Puteți verifica dacă există proprietatea:

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

Sau dacă ați creat clase (care poate nu ai), poti folosi de exemplu:

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

Sau, puteți modifica tipurile deci au toate o proprietate în comun, care apoi puteți verifica pentru a vedea ce tip ai de-a face cu. Acest lucru este uneori numit un "discriminate uniunii".

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

Multumesc. Am fost capabil de a utiliza acest pentru a seta valoarea implicită pe câmp de formular cu ternare: 'currentTeam' in userData ? userData.currentTeam.teamName: 'No Team Set'
Rafael Zasas

În alte limbi

Această pagină este în alte limbi

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