Typescript类型暗示内点符号
我有以下界面:Typescript类型暗示内点符号,typescript,Typescript,我有以下界面: export interface IRenderStruct { type: string; props: { className?: string; children?: (string | IRenderStruct) | (string | IRenderStruct)[]; [propName: string]: any; }; } 因此,结果对象可以通过elm.props.children嵌套在内部。我现在正在创建一些单元测试,在一
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编译器抱怨我无法访问类型
,因为子项
可能是一个字符串,并且没有类型
属性
好的,TS-你说得对!但我肯定知道,在这种情况下,我们将有嵌套结构。我如何告诉TS这是事实?创建一个用户定义的类型保护来检查它:
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
s。如果防护失败,test
将为false
,您的测试将失败。这样你甚至可以得到更大范围的错误。对于这个测试,你可能需要使用isFish()然后正确地强制转换它来进行测试。这是有效的,但也给出了一个有趣的例子:如果保护失败,我的单元测试预期检查永远不会执行:)现在做了:if(guard){…}else expect(false)。toBeTruthy()
但是上帝,这太难看了…:(再次核对我的答案