typescript - 如何快速区分具有非重叠属性的接口(interface)

标签 typescript strict type-deduction

在 typescript 中,我通常有一个类型如下的变量:

const variable: { a: string } | { b: number };

当我想检查变量的形状时,我通常想做

if (variable.a !== undefined) {
  // do stuff
}
else {
  // do stuff

但是在严格模式下,typescript 会在 variable.a 处抛出类型错误,因为不知道 variable 具有属性 a。为了解决这个问题,我通常转换为 any,例如 (variable as any).a !== undefined。然而,typescript 不会将其视为类型保护,也不会缩小 variable 的类型。

在严格模式下(无需自定义类型保护),是否有“正确”的方式在 typescript 中进行此检查?

一些我试过的例子(不幸的是,它们也会抛出类型错误):

  • typeof variable.a !== 'undefined'
  • variable.hasOwnProperty('a')

最佳答案

在这种情况下,最简单的区分方法是 in 类型保护:

declare const variable: { a: string } | { b: number };


if ('a' in variable) {
    variable.a
}
else {
    variable.b
}

关于typescript - 如何快速区分具有非重叠属性的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56951240/

相关文章:

Angular 6 - 使用 *ngFor 显示数据的问题(数据未显示)

c++ - 为什么最简单的C++代码都编译不出来?

c++ - basic_string<CharT> 与 CharT*

javascript - 指令未以 Angular 显示

angular - 在Angular 6中通过http get处理复杂对象

erlang - 为什么 Erlang 会在存在高阶函数的情况下放弃生成堆栈跟踪?

javascript - 如何在不使用 "arguments"的情况下计算 JavaScript 函数的参数数量?

c++ - 使用 std::initializer_list 构造函数而不产生歧义?

javascript - 如何在 Typescript 中描述原型(prototype)继承?

javascript - 严格模式下获取当前函数名