如何快速区分具有非重叠属性的接口

How to quickly discriminate between interfaces with non-overlapping properties

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

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。但是打字稿不会将其视为类型保护,也不会缩小 variable.

的类型

是否有 "proper" 在严格模式下(无需自定义类型保护)在 typescript 中执行此检查的方法?

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

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

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


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