我有一些基本上像这样的
的Typescript代码if( ... )
result = $(document.createElement("div")) ;
} else if( ... ) {
result = $(document.createElement("div")) ;
} else {
assert.unreachable( "Unknown label in buildHTML.") ;
}
result.attr( "data-childNumber", childNumber.toString() ) ;
assert.unreachable
的返回类型为never
。
显示的最后一行出现错误“在分配之前使用变量'结果'。”
在我看来,来自never
的{{1}}结果应告诉编译器assert.unreachable
部分没有路径。
我知道我可以通过在else
的末尾添加throw null;
来抑制错误,但这似乎不够优雅。
else
的定义中出现了类似的问题。它看起来像这样
unreachable
其中export function unreachable( message? : string ) : never {
if( message===undefined ) message = "Unreachable code reached." ;
else message = "Unreachable code reached: "+message ;
raiseTheAlarm( message ) ;
}
的结果类型为raiseTheAlarm
。在这种情况下,我收到一个错误“函数返回'永远'不能有一个可达的终点。”
我通过在调用never
之前添加return
关键字来解决此问题。这看起来有点奇怪。 (当然,raiseTheAlarm
通话后也会有效。)
有没有更好的方法告诉编译器代码中的某个点无法访问?
答案 0 :(得分:2)
在我看来,
assert.unreachable
的永远结果应该是 告诉编译器没有其他部分的路径。
反之亦然。当编译器检测到某个路径无法访问时,它会为该路径中引用的变量推断never
类型,如果可以的话。您可以使用它来强制您的代码处理枚举或联合类型的所有可能值,如here所述。
但是,当编译器在初始化之前检查该变量未使用时,编译器不会使用某些路径无法访问的信息。解决方案很简单 - 您可以在无法到达的路径中为该变量分配never
值。正如上面链接的答案中所解释的那样,never
可以专门为此目的分配给任何其他类型。
if( ... )
result = $(document.createElement("div")) ;
} else if( ... ) {
result = $(document.createElement("div")) ;
} else {
result = assert.unreachable( "Unknown label in buildHTML.") ;
}
result.attr( "data-childNumber", childNumber.toString() ) ;
unreachable
功能的问题以相同的方式修复 - 它应该
return raiseTheAlarm( message ) ;
作为最后一句话。
答案 1 :(得分:1)
至少有三个选项
(a)中
else {
return assert.unreachable( "Unknown label in buildHTML.") ;
}
(b)(来自@ artem'答案)
else {
result = assert.unreachable( "Unknown label in buildHTML.") ;
}
(c)中
else {
assert.unreachable( "Unknown label in buildHTML.") ;
throw null ;
}
我选择了(a)。