如何指示TypeScript中无法访问路径

时间:2017-06-09 21:48:03

标签: typescript

我有一些基本上像这样的

的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通话后也会有效。)

有没有更好的方法告诉编译器代码中的某个点无法访问?

2 个答案:

答案 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)。