如何忽略由" never"引起的编译时错误类型

时间:2016-10-17 04:58:45

标签: typescript typescript2.0

Demonstration of error in TypeScript Playground

Typescript知道我对这个函数的每次调用都是传递类型PermanentError,所以在else子句中,参数的类型是"错误"已更改为" never",这会导致编译时错误,因为从来没有消息字段:

function(error: Error) {
    if (error instanceof PermanentError) {
        // Do stuff

    } else {
        Log(error.message);
    }
}

Typescript对于现在的代码是正确的,但我希望它能处理未来代码可能通过的所有可能的错误,这个问题的一个好的Typescript-2方法是什么?

以下没有成功:

if (typeof(error) != 'never') Log(error.message);

但是,这也试图破解流式分析,更熟悉流式分析语言的人可能对我正在做的事情采用完全不同的方法。

更新

使用Sohnee的Playground示例,很明显TypeScript错误取决于PermanentError,而不是程序传递给函数的参数。

如果PermanentError包含toString(),则错误can be seen,如下所示:

class PermanentError extends Error {
    toString()  { return 'A permanent error'; }
}

然而奇怪的是,为该班makes the error dissappear添加了另一种方法:

class PermanentError extends Error {
    toString()  { return 'A permanent error'; }
    moreMagic() { return 'This is a mock method'; }
}

an empty PermanentError class

一样
class PermanentError extends Error {
}

也许这是一个TypeScript错误,我应该把它带到他们的bug跟踪器?

2 个答案:

答案 0 :(得分:1)

如果我“忘记”扩展Error类......

,我只能重现你的情况

在下面的示例中,类型保护在errorPermanentErrorifError正确键入else

class PermanentError extends Error {
}

function example(error: Error) {
    if (error instanceof PermanentError) {
        alert('Permanent Error ' + error.name);
    } else {
        console.log(error.message);
    }
}

使用不扩展PermanentError的结构合理Error时,我也发现没问题:

class PermanentError {
    name: string;
    message: string;
    stack: string;
}

请参阅此TypeScript Playground

答案 1 :(得分:1)

TypeScript使用duck typing。这意味着它将比较类结构,而不是它的名称。

在您的示例中,PermanentErrorError具有相同的结构,因此它们是相同的。当您检查error instanceof PermanentError时,它将永远是真的。

当您更改PermanentError的结构时,它不再与Error相同,编译错误就消失了。