typescript - 检查变量是否属于具有相同属性的 Typescript 中的自定义类型

标签 typescript types typeguards

有以下几种类型:

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;

我搜索了解决方案,发现类型保护是检查自定义类型的最优雅的方式。但是在所有示例中,它们都会过滤该类型的显式属性。喜欢:

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

A型或B型怎么写? 此外,类型可能会随着时间的推移而改变(而不是在运行时!),这需要一个不检查显式属性的解决方案。这可能吗?

最佳答案

在运行时,您拥有的只是“原始”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;

这个设计模式叫做“Discriminated Unions”,the Typescript Handbook documents the intended usage .

关于typescript - 检查变量是否属于具有相同属性的 Typescript 中的自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61268852/

相关文章:

haskell - 为什么Haskell 在部分函数中使用bottom 而不是null?

typescript - Typeguard 不会缩小类型

typescript - 为什么我的 TypeScript 报告联合类型的错误?

javascript - 经济拒绝 127.0.0.1 :443

angular - 错误 TS5023 : Unknown compiler option 'compilerOptions'

python - 如何在Python中将多个整数转换为c_ubyte的ctypes数组

python - 方法的日志装饰器

angular - Firebase : firebase. Promise<any> 与 Rxjs Promise<any> 的兼容性

Angular -- ExpressionChangedAfterItHasBeenCheckedError : Expression has changed after it was checked.(嵌套 FormArray)

typescript - 错误分支中带有补码的类型保护