如何在TypeScript中区分两种不同的对象类型?

时间:2016-09-28 00:29:35

标签: 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 个答案:

答案 0 :(得分:3)

是一种解决方法,但您可以通过使用键入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;
  }
}