Come dichiarare una variabile di tipo A o B quando si estende l'altro in Dattiloscritto

0

Domanda

Ho un contesto fornitore di servizi di flussi di dati utente durante tutto l'app.

Ho uno Studente di interfaccia:

export interface Student extends User

Vorrei che il provider per restituire i dati utente di tipo Student o User come segue:

let userData: Student | User = null;

Quando si tenta di accedere a una proprietà disponibile solo per gli studenti, userData?.currentTeamVS Codice genera il seguente errore:

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

Ho bisogno di aiuto per capire perché si è inadempiente al genitore interfaccia e come consentire l'opzione di entrambi.

1

Migliore risposta

1

Questo è il comportamento standard dei sindacati: se non si fa qualcosa per controllare che tipo si tratta, dattiloscritto consentono solo l'accesso a proprietà che esiste in tutti i paesi membri dell'unione.

Qui sono alcuni esempi di come è possibile restringere il tipo. Si può controllare se la proprietà non esiste:

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

O se avete creato delle classi (di cui non abbiamo), è possibile utilizzare istanza di:

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

O, è possibile modificare i tipi in modo che tutti hanno una proprietà in comune, che si può quindi controllare per vedere che tipo si tratta. Questo è talvolta chiamato un "discriminati unione".

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

Grazie. Sono stato in grado di utilizzare questo menu per impostare il valore predefinito per il campo del form con il ternario: 'currentTeam' in userData ? userData.currentTeam.teamName: 'No Team Set'
Rafael Zasas

In altre lingue

Questa pagina è in altre lingue

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