您没有在此处的empty()
Call中提供显式泛型类型:
const b = abc ?? empty()
但是TypeScrip可以从表达式中推断出该类型-它知道abc
是number[] | null
类型,所以它推断empty
调用的类型参数是number
(顺便说一下,你可以通过你的链接在操场上看到它,如果你把鼠标悬停在empty()
上).所以你的台词基本上变成了:
const b = abc ?? empty<number>();
因此,B也是类型number[]
.请注意,省略泛型类型参数并不意味着它将变为unknown
.
至于类型推断到底是如何工作的--据我所知,目前还没有严格的规范.最后specification version个被存档,不再维护.与这个存档的规范相比,有changes个要分类的推理规则.因此,你所拥有的最好的信息来源是docs,这是相当模糊的.相关的部分被称为"上下文类型",它概括地描述了在许多情况下,TypeScrip能够从上下文推断泛型类型参数,但没有严格地描述它是如何工作的.
然而,这个 case 似乎相当清楚.在左手边的??表达式具有已知类型表达式,因此在右侧使用相同的类型并省略泛型类型参数是有意义的.