如何快速区分具有非重叠属性的接口
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 中执行此检查的方法?
我试过的一些例子(不幸的是,它们也会抛出类型错误):
typeof variable.a !== 'undefined'
variable.hasOwnProperty('a')
在这种情况下最简单的区分方法是 in
类型保护:
declare const variable: { a: string } | { b: number };
if ('a' in variable) {
variable.a
}
else {
variable.b
}
在打字稿中,我通常有一个类型如下的变量:
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 中执行此检查的方法?
我试过的一些例子(不幸的是,它们也会抛出类型错误):
typeof variable.a !== 'undefined'
variable.hasOwnProperty('a')
在这种情况下最简单的区分方法是 in
类型保护:
declare const variable: { a: string } | { b: number };
if ('a' in variable) {
variable.a
}
else {
variable.b
}