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跟踪器?
答案 0 :(得分:1)
如果我“忘记”扩展Error
类......
在下面的示例中,类型保护在error
中PermanentError
和if
中Error
正确键入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;
}
答案 1 :(得分:1)
TypeScript使用duck typing。这意味着它将比较类结构,而不是它的名称。
在您的示例中,PermanentError
与Error
具有相同的结构,因此它们是相同的。当您检查error instanceof PermanentError
时,它将永远是真的。
当您更改PermanentError
的结构时,它不再与Error
相同,编译错误就消失了。