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()
但是上帝,这太难看了…:(再次核对我的答案