TypeScript使用扩展类时数组类型推断错误问题咨询
这个现象是TypeScript的最佳公共类型推断规则和结构化类型系统共同作用的结果:
- TypeScript采用结构化类型兼容规则,判断类型是否兼容只看成员结构是否匹配,和名义继承关系无关。你的代码里
typeof AnotherAnn的静态defaultValues属性包含id和id2两个字段,typeof YetAnotherAnnotation的静态defaultValues仅包含id字段,前者完全覆盖后者的结构要求,因此typeof AnotherAnn是typeof YetAnotherAnnotation的子类型,可以直接赋值给后者类型的变量。 - TypeScript推断数组类型时,会自动查找所有数组成员的最佳公共超类型:如果所有成员都能兼容同一个公共类型,就会直接将数组推断为该公共类型的数组,不会自动生成联合类型。
- 本场景中两个类构造函数的最佳公共类型就是
typeof YetAnotherAnnotation,因此变量x的推断类型为(typeof YetAnotherAnnotation)[]。
如果你需要得到预期的联合类型,显式标注变量类型即可:
const x: (typeof AnotherAnn | typeof YetAnotherAnnotation)[] = [AnotherAnn, YetAnotherAnnotation]
内容的提问来源于stack exchange,提问作者ritz078
相关产品推荐
相关产品推荐

