我有以下界面:
export interface IRenderStruct {
type: string;
props: {
className?: string;
children?: (string | IRenderStruct) | (string | IRenderStruct)[];
[propName: string]: any;
};
}
因此,生成的对象可以通过elm.props.children
嵌套在内部。我现在正在创建一些单元测试,在一种情况下,我知道我将有一个RenderStruct对象作为另一个的子节点。没有字符串作为子项,也没有作为子项的RenderStruct对象数组。
但是当我想这样做时:
expect(result.props.children.type === 'something');
TS编译器抱怨我无法访问type
,因为children
可能是一个字符串而且没有type
属性。
好的,TS - 你是对的!但我绝对知道在这种情况下我们将拥有嵌套结构。我怎么告诉TS它的情况呢?
答案 0 :(得分:0)
创建一个用户定义的类型保护来检查它:
var render: IRenderStruct;
// function to check if something is an IRenderStruct:
function isIRenderStruct(p: any): p is IRenderStruct {
return ('props' in p) && ('type' in p);
}
let b: boolean;
if (isIRenderStruct(render.props.children)) {
b = render.props.children.type === 'something'; // No errors
}
修改强>:
对于您的测试的具体情况,您可以:
let test = false;
if (isIRenderStruct(render.props.children)) {
test = render.props.children.type === 'something'; // No errors
}
expect(test).toBeTruthy();
通过这种方式,您可以避免使用else
。如果防护失败,test
将为false
,您的测试将失败。这样你甚至可以得到更广泛的错误。