如何使用 '!在TypeScript中运算符'with'in operator'?

时间:2018-04-26 08:51:29

标签: typescript

我使用strikNullCheks选项进行编程。

! operatorin operator一起使用时,出现以下错误。 (这正是我使用Redux的Action的有效负载时会发生的情况。)

有没有办法解决这个问题?

感谢您阅读:)

interface Interface {
    AB?: {
        a: number;
    } | {
        b: number[];
    }
}

function test(ab: Interface['AB']) {
    const ab2 = ('a' in ab!) ? [ab!.a] : ab!.b;
    => error: Property 'a' does not exist on type '{ a: number; } | { b: number[]; }'. 
              Property 'a' does not exist on type '{ b: number[]; }'.
    => error: Property 'b' does not exist on type '{ a: number; } | { b: number[]; }'.
              Property 'b' does not exist on type '{ a: number; }'
}

example

1 个答案:

答案 0 :(得分:3)

in类型保护(通常是类型保护)不适用于表达式。因此,ab!表达式不会导致ab的缩小。要使类型保护工作,保护表达式必须是简单的参数/变量/字段。最简单的解决方案是明确防范null。这可能是一个好主意,因为该字段是可选的:

function test(ab: Interface['AB']) {
    const ab2 = !ab ? null : ('a' in ab) ? [ab.a] : ab.b;
}