TypeScript使用泛型时未校验返回类型的原因
class Foo<T> { lift<R>(): Foo<R> { const bar = new Foo<T>() return bar } }
为什么这段代码没有抛出类型错误
这是 TypeScript 结构类型系统的正常表现,核心逻辑非常直接:
- TypeScript 判断两个类型是否兼容,只校验两者的实际结构是否匹配,不会单纯因为声明时传入的泛型参数不同就判定类型不兼容。
- 你定义的
Foo<T>类里,没有任何属性、方法的类型和泛型参数T绑定:不管给Foo传入T还是R作为泛型参数,生成的实例结构完全一致,没有任何能区分两者的类型差异。因此 TS 会判定Foo<T>和Foo<R>是完全可以互相赋值的兼容类型,自然不会在return bar的位置抛出错误。
你可以做个简单验证:只要给Foo加一个用到泛型参数的成员,TS 立刻就能识别出类型不匹配:
class Foo<T> { // 新增一个依赖泛型T的属性,哪怕是私有属性、没有实际赋值也可以 private value?: T lift<R>(): Foo<R> { const bar = new Foo<T>() // 这里会直接抛出类型错误:类型 "Foo<T>" 不能赋值给类型 "Foo<R>" return bar } }
补充说明:只要泛型参数在类的任意成员类型中被引用过,TS 就会把绑定不同泛型参数的
Foo实例判定为不同类型,不再允许跨类型赋值。
内容的提问来源于stack exchange,提问作者Archsx
相关产品推荐
相关产品推荐

