typeof typeguard在分配给变量时不起作用吗?

时间:2018-05-12 07:34:00

标签: javascript typescript

当我使用下面的typeof时出现错误。

function func (variable: number | string) {
    const is_number = (typeof variable === 'number');
    let variable2: number,
        variable3: string;

    if (is_number)
        variable2 = variable;
        => Type 'string | number' is not assignable to type 'number'.
           Type 'string' is not assignable to type 'number'.
    else
        variable3 = variable;
        => Type 'string | number' is not assignable to type 'string'.
           Type 'number' is not assignable to type 'string'.
}

但是,没有如下所示的错误。

function func (variable: number | string) {
    let variable2: number,
        variable3: string;

    if (typeof variable === 'number')
        variable2 = variable;
    else
        variable3 = variable;
}

URL for test

我是否总是像上面那样使用它?或者是否有任何我错误使用过的部分?

感谢阅读:)

1 个答案:

答案 0 :(得分:1)

@ Ry-已在评论中回答了实际问题。以下是限制的解决方法。

可以做一些类似于你试图用辅助函数实现的东西我会调用isNumber,它会断言给定的参数extends是否为某种类型在打字稿中。这提供了一种不像内置typeof variable === "number"这样的JS领域类型断言的方法。相反,断言现在包含在一个函数中。

这是使用x is y构造完成的,该构造称为Type predicate(您必须向下滚动一点)。在以下代码段中,返回类型isNumber是一种类型谓词:

const isNumber = (subject: any): subject is number => {
    return typeof subject === 'number';
};

这里,typescript可以从number返回的布尔值推断类型isNumber。现在,如果你在自己的func中使用这个辅助函数,那么一切都应该是好的:

function func (variable: number | string) {
    let variable2: number;
    let variable3: string;

    if (isNumber(variable)) {
        variable2 = variable;
    } else {
        variable3 = variable;
    }
}

由于只有if返回true才会执行isNumber(variable)块,所以Typescript现在将假定为subject is number。以下伪代码演示了TS应如何解释上述代码:

if (variable is number) {
    // ...
}

我还发现this SO answer进一步解释了类型谓词构造。