在某些参数类型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
并结束。