点符号内的打字稿类型提示

时间:2018-05-02 11:44:59

标签: typescript

我有以下界面:

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它的情况呢?

1 个答案:

答案 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,您的测试将失败。这样你甚至可以得到更广泛的错误。