网站搜索

我如何在 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;
  }
}