我如何在 TypeScript 中区分两种不同的对象类型?
假设我有以下代码:
function myFunction(x: { foo: number } | { bar: string }) {我如何编写一些代码来判断 x 是第一种类型还是第二种类型?
我考虑过的事情:
- 编写一个
x is MyType函数来检查foo属性。是的,我可以这样做,但对于仅作为单个函数参数使用的类型来说,这似乎有些过头了。 if ((x as { foo: number }).foo) { let y=x as { foo: number }。我可以这样做,但这违背了类型系统的初衷。- 给它们两个一个共同的
type属性。同样,对于仅用作一个函数参数的类型,这似乎有些过度设计。
答案#1
这也是一种变通方法,但你可以通过扩展现有类型并添加类型为 never 的可选字段来统一这些类型的字段,这样每种类型理论上都拥有联合中可能的所有字段:
{ foo: number, bar?: never } | { bar: string, foo?: never }
通过让超集类型包含所有字段,你可以进行如下类型检查:
type CompletelyDisjointed = { foo: number, bar?:never } | { foo?: never, bar: string };
function myFunction(x: CompletelyDisjointed): string | number {
if (typeof x.bar === 'string') {
return x.bar;
} else {
return x.foo;
}
}
