Biri diğerini Typescript'te genişlettiğinde A veya B tipi değişken nasıl bildirilir

0

Soru

Uygulama boyunca kullanıcı verilerini aktaran bir içerik sağlayıcım var.

Bir Öğrenci arayüzüm var:

export interface Student extends User

Sağlayıcının türdeki kullanıcı verilerini döndürmesini istiyorum Student veya User aşağıdaki gibi:

let userData: Student | User = null;

Yalnızca öğrenciler tarafından kullanılabilen bir mülke erişmeye çalışırken, userData?.currentTeam, VS Kodu aşağıdaki hatayı atar:

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

Ana arayüze neden varsayılan olduğunu ve her ikisinin de seçeneğine nasıl izin verileceğini bulmak için yardıma ihtiyacım var.

1

En iyi cevabı

1

Bu, sendikaların standart davranışıdır: Hangi türle uğraştığınızı kontrol etmek için bir şey yapmadığınız sürece, typescript yalnızca birliğin tüm üyelerinde bulunan özelliklere erişmenize izin verir.

Türü nasıl daraltabileceğinize dair bazı örnekler aşağıda verilmiştir. Mülkün var olup olmadığını kontrol edebilirsiniz:

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

Veya sınıflar oluşturduysanız (sahip olmayabileceğiniz), aşağıdakileri kullanabilirsiniz:

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

Ya da türleri, hepsinin ortak bir özelliği olacak şekilde değiştirebilir ve daha sonra hangi türle uğraştığınızı kontrol edebilirsiniz. Buna bazen "ayrımcılığa uğramış birlik" denir.

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

teşekkür ederim. Bunu, form alanındaki varsayılan değeri üçlü ile ayarlamak için kullanabildim: 'currentTeam' in userData ? userData.currentTeam.teamName: 'No Team Set'
Rafael Zasas

Diğer dillerde

Bu sayfa diğer dillerde

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