说我有以下代码:
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
财产。同样,对于仅用作一个函数的参数的类型来说,似乎有些过分。答案 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;
}
}