静态方法返回泛型类实例时Flow报类型不兼容,求排查
解决Flow中泛型类静态方法返回实例的类型不兼容问题
咱们先明确:这不是Flow的问题,是你的代码写法没处理好泛型类里静态方法的泛型逻辑。
问题根源分析
泛型类的<T>是作用于实例层面的,而静态方法属于类本身,无法共享实例的泛型参数。你在staticMethod里写的T,其实是一个独立于类的<T>的新泛型参数——Flow会把这两个T当成完全不相关的类型,自然会提示不兼容。
看你的原代码:
class Foo<T> { var1: T constructor(var1: T) { this.var1 = var1 } static staticMethod(var1: T) { return new Foo(var1) } } let x:Foo<number> = new Foo(1) // works let y:Foo<number> = Foo.staticMethod(1) // doesn't work
这里staticMethod的T和类的T没有关联,当你调用Foo.staticMethod(1)时,Flow无法将方法的T和Foo<number>的T绑定,所以认为返回的Foo<T>和Foo<number>类型不匹配。
修正方案
给静态方法单独声明自己的泛型参数,并且明确返回对应的Foo类型,让Flow能正确推断泛型关联:
class Foo<T> { var1: T constructor(var1: T) { this.var1 = var1 } // 给静态方法声明独立的泛型参数U,明确返回Foo<U> static staticMethod<U>(var1: U): Foo<U> { return new Foo(var1) } } let x:Foo<number> = new Foo(1) // works let y:Foo<number> = Foo.staticMethod(1) // now works!
这样,当你传入1(number类型)时,Flow会推断出U是number,返回的Foo<U>就是Foo<number>,和y的类型完全匹配,错误就消失了。
内容的提问来源于stack exchange,提问作者Naman Nehra
相关产品推荐
相关产品推荐

