Ako deklarovať premennú typu A alebo B, keď jeden rozširuje iným Strojom

0

Otázka

Mám kontexte služieb, ktoré prúdy údajov užívateľa v celej app.

Som Študent rozhranie:

export interface Student extends User

Chcela by som, aby služieb, ak sa chcete vrátiť údaje používateľa typu Student alebo User a dopĺňa takto:

let userData: Student | User = null;

Pri pokuse o prístup k majetku, k dispozícii len pre študentov, userData?.currentTeam, VS Kód hodí nasledujúce chybové hlásenie:

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

Potrebujem pomôcť zistiť, prečo je default materskej rozhranie a ako povoliť možnosť oboch.

1

Najlepšiu odpoveď

1

Toto je štandardné správanie odbory: pokiaľ budete robiť niečo, ak chcete skontrolovať, aký máte čo do činenia s, záznam vám len umožní prístup vlastnosti, ktoré existujú na všetkých členov únie.

Tu sú niektoré príklady, ako môžete zúžiť typu. Môžete skontrolovať, či je táto vlastnosť existuje:

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

Alebo ak ste vytvorili triedy (čo nemusí byť), môžete použiť inštanciu:

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

Alebo, môžete zmeniť typy, takže všetci majú nehnuteľnosť v spoločnej, ktoré potom môžete skontrolovať, aké máte do činenia. Toto sa niekedy nazýva aj "diskriminovaných únie".

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

Ďakujem. Bol som schopný použiť toto nastavenie na predvolené hodnoty na pole formulára s ternární: 'currentTeam' in userData ? userData.currentTeam.teamName: 'No Team Set'
Rafael Zasas

V iných jazykoch

Táto stránka je v iných jazykoch

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