Jak deklarovat proměnnou typu A nebo B, když jeden táhne druhého na Stroji

0

Otázka

Mám souvislosti poskytovatele, který proudy uživatelských dat v celé aplikaci.

Jsem Student rozhraní:

export interface Student extends User

Rád bych poskytovatelem, vrátit uživatelská data typu Student nebo User takto:

let userData: Student | User = null;

Při pokusu o přístup k vlastnosti k dispozici pouze pro studenty, userData?.currentTeam, VS Kód hodí následující chybu:

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

Musím zjistit, proč to je prodlení na mateřské rozhraní a jak povolit obojí.

1

Nejlepší odpověď

1

To je standardní chování sdružení: pokud vás něco udělat, aby zkontrolovat, jaký typ máte co do činění s, strojopis bude jen vám umožní přístup k vlastnosti, které existují na všechny členy unie.

Zde jsou některé příklady toho, jak si můžete zúžit typ. Můžete zkontrolovat, pokud nemovitost existuje:

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

Nebo pokud jste vytvořili tříd (což nemusí), můžete použít například:

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

Nebo, můžete změnit typy tak mají všichni majetku společného, který pak můžete zkontrolovat, jaký typ máte co do činění. To se někdy nazývá "discriminated unie".

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

Děkuji. Byl jsem schopen používat to, aby nastavit výchozí hodnotu na pole formuláře s ternární: 'currentTeam' in userData ? userData.currentTeam.teamName: 'No Team Set'
Rafael Zasas

V jiných jazycích

Tato stránka je v jiných jazycích

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