Typescript接口为一系列OR接口

时间:2019-12-19 22:43:17

标签: javascript typescript interface

有一个接口可以是许多接口之一

interface a {x:string}
interface b {y:string}
interface c {z:string}
type all = a | b | c

稍后某个对象满足all,因为它的类型为c

通话

    if (obj.hasOwnProperty('z')) {
      return obj.z
    }

由于以下原因而无法编译

类型'a'不存在属性'z'。

您如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果在您的情况下,可以将hasOwnProperty替换为in,并且您不想定义自定义类型防护-in will do the job

interface a { x: string }
interface b { y: string }
interface c { z: string }
type all = a | b | c;

function foo(obj: all) {
  if ('z' in obj) {
    return obj.z; // obj type is narrowed to c
  }
  return undefined;
}

Playground

答案 1 :(得分:0)

obj.hasOwnProperty('z')本身并不保证obj满足接口c。假设obj被声明为

var obj = { x: "foo"; y: "bar"; z: true };

在这种情况下,obj满足ab,但不能满足c,因为obj.z不是字符串。

但是,您可以编写自己的类型保护程序来解决此问题:

function isC(obj: all): obj is c {
  return obj.hasOwnProperty('z');
  // or return 'z' in obj;
}

...

if (isC(obj)) {
  return obj.z; // this is fine
}