Como declarar variáveis do tipo A ou B, quando se estende a outros no Typescript

0

Pergunta

Eu tenho um provedor de contexto, que os fluxos de dados do usuário em todo o aplicativo.

Eu tenho um Aluno de interface:

export interface Student extends User

Eu gostaria que o fornecedor para retornar dados de usuário do tipo Student ou User como segue:

let userData: Student | User = null;

Ao tentar acessar uma propriedade disponível apenas para estudantes, userData?.currentTeamVS Código gera o seguinte erro:

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

Eu preciso de ajuda para descobrir por que é padrão para o pai interface e como permitir a opção de ambos.

1

Melhor resposta

1

Esse é o comportamento padrão dos sindicatos: a menos que você faça algo para verificar que tipo você está lidando com typescript só vai permitir o acesso a propriedades que existem em todos os membros da união.

Aqui estão alguns exemplos de como você pode restringir o tipo. Você pode verificar se o imóvel existe:

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

Ou se você criou classes (que você não pode ter), você pode usar o exemplo de:

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

Ou, você pode alterar os tipos, para todos eles têm uma propriedade em comum, que, em seguida, você pode verificar para ver que tipo você está lidando com. Isso é às vezes chamado de "vítima da união".

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

Obrigado. Eu era capaz de usar esta opção para definir o valor padrão no campo de formulário com o ternário: 'currentTeam' in userData ? userData.currentTeam.teamName: 'No Team Set'
Rafael Zasas

Em outros idiomas

Esta página está em outros idiomas

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