打字稿:为什么'let val: K扩展K?字符串:any = " " ' 不编译?



在某些参数类型K存在的上下文中,很明显K extends string | number | symbol

let val: K extends K ? string : any = ""

给出一个编译错误:

TS2322:类型'string'不能赋值给类型'K扩展K ?String: any'.

我希望这个可以编译,因为K extends K的值应该是true。
一般来说,true ? A : B不总是被推断为A吗?这里的问题是什么?

如果K可以是任何,它很可能是一些非常极端的情况,如never,void,unknown,any。TS类型系统是如此之大,以至于我不敢假设"K总是扩展它自己"。

我仍然没有得到用例:如果编译器将被显式地告知期望表达式K extends K总是评估为真,整个表达式将是无用的,只是短路到string,不是吗?

是否存在用例,或者只是为了用例而用例?

IMHOextends表达式的使用通常应该保留为返回值和参数:当你必须将值赋给常量或变量时,你的右侧应该计算为特定类型的特定值。

最后,如果您只需要编译表达式,因为稍后您将覆盖该值,只需添加as any并结束。

最新更新