Проверьте, принадлежит ли переменная пользовательскому типу в Typescript с такими же свойствами - PullRequest
1 голос
/ 17 апреля 2020

Существуют следующие типы:

type TypeA = {
  desc: string;
  name: string;
}

type TypeB = {
  desc: string;
  name: string;
  age: number;
}

type TypeC = {
  desc: string;
  name: string;
  age: number;  
  gender: string;  
}

type TypeAll = TypeA | TypeB | TypeC;

Я искал решение и обнаружил, что Typeguards - самый элегантный способ проверки пользовательских типов. НО во всех примерах они фильтруют явное свойство этого типа. Как:

isTypeC(type: TypeAll):type is TypeC {
  return type.gender !== undefined
}    

Как написать это для TypeA или TypeB? Кроме того, может случиться так, что типы будут меняться со временем (не во время выполнения!), И для этого необходимо решение, которое не проверяет явные свойства. Это возможно?

1 Ответ

1 голос
/ 17 апреля 2020

Во время выполнения все, что у вас есть, это «сырой» JSON -объект. Поэтому у вас нет другого способа установить его тип, кроме проверки полезной нагрузки. Обычно можно использовать какое-либо свойство «тегирования», чтобы безопасно различать эти различные типы и избежать путаницы в типах с перекрывающимися свойствами:

type TypeA = {
  type: "A";
  desc: string;
  name: string;
}

type TypeB = {
  type: "B";
  desc: string;
  name: string;
  age: number;
}

type TypeC = {
  type: "B";
  desc: string;
  name: string;
  age: number;  
  gender: string;  
}

type TypeAll = TypeA | TypeB | TypeC;

Этот шаблон проектирования называется «Дискриминационные объединения», Руководство Typescript документирует предполагаемое использование .

...