Cómo declarar variables de tipo a o B, cuando uno extiende la otra en el Manuscrito

0

Pregunta

Tengo un contexto de proveedor de flujos de datos de usuario en toda la aplicación.

Tengo un Alumno de la interfaz:

export interface Student extends User

Me gustaría que el proveedor de regresar de datos de usuario de tipo Student o User de la siguiente manera:

let userData: Student | User = null;

Cuando se intenta acceder a una propiedad disponible sólo para los estudiantes, userData?.currentTeamVS Código arroja el siguiente error:

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

Necesito ayuda para encontrar la razón de por qué se está estableciendo para el padre de la interfaz y cómo permiten la opción de ambos.

1

Mejor respuesta

1

Este es el comportamiento estándar de los sindicatos: a menos que usted haga algo para comprobar qué tipo usted está tratando con, mecanografiado sólo permitirá que usted acceda a las propiedades que existen en todos los miembros de la unión.

Aquí están algunos ejemplos de cómo se puede restringir el tipo. Puede comprobar si la propiedad existe:

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

O si usted ha creado clases (los cuales puede que no), puede utilizar el ejemplo de:

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

O, usted puede cambiar los tipos, para todos ellos tienen una propiedad en común, que puede, a continuación, comprobar para ver qué tipo se trata. Esto a veces se llama una "unión discriminada".

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

Gracias. Yo era capaz de utilizar esto para establecer el valor predeterminado en el campo de formulario con el ternario: 'currentTeam' in userData ? userData.currentTeam.teamName: 'No Team Set'
Rafael Zasas

En otros idiomas

Esta página está en otros idiomas

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