有一个接口可以是许多接口之一
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'。
您如何解决这个问题?
答案 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;
}
答案 1 :(得分:0)
obj.hasOwnProperty('z')
本身并不保证obj
满足接口c
。假设obj
被声明为
var obj = { x: "foo"; y: "bar"; z: true };
在这种情况下,obj
满足a
和b
,但不能满足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
}