如何用Typescript比较两个接口?

时间:2019-02-20 15:50:51

标签: typescript

如果我具有以下界面:

interface A {
  propA: string;
  propB: string;
}

interface B extends A {
  propC: string;
}

我还有另一个属性,例如:

interface Props {
  x: A | B
}

如何检查x的接口类型是A还是B?在这种情况下,由于这些不是课程,我是否需要进行深度比较?

我正在研究几种不同的方法,例如用户定义的类型防护,或者可能使用联合类型,但没有骰子。

1 个答案:

答案 0 :(得分:1)

在并集类型中,只要您能找到一个鉴别符(具有特定类型或仅在并集内的一种类型中存在的字符),就可以在类型保护器内使用它:

interface A {
  propA: string;
  propB: string;
}

interface B extends A {
  propC: string;
  propD: string;
}

interface Props {
  x: A | B
}

const props: Props = {
  x: null as any
}

if ('propC' in props.x) {
  // TypeScript here assumes it is B 
  console.log(props.x.propC) // works
  console.log(props.x.propD) // also works
} else {
  // TypeScript here assumes it is A 
  console.log(props.x.propC) // error
  console.log(props.x.propD) // also error
  console.log(props.x.propA) // works
}