Flow中如何使用类泛型约束内的泛型类型?避免重复声明
解决Flow中Class泛型复用Foo内部T类型的问题
这个问题我之前也碰到过,Flow的泛型约束语法确实不允许你那种嵌套声明泛型参数的写法(Class<F : Foo<T : BoundType>>里的T : BoundType是非法的,因为泛型参数必须在尖括号的最外层声明)。不过有两种可行的方案能帮你消除类型重复,不用重复定义T的约束:
方案一:显式关联T与F,复用Foo的约束
把T提升为Class的泛型参数,同时约束F必须是Foo<T>。这样T的BoundType约束只需要在Foo里声明一次,Class直接复用这个约束:
type BoundType = { /* 你的约束定义 */ }; type Foo<T: BoundType> = { bar: T }; // 这里T的约束继承自Foo的定义,不用重复写: BoundType class Class<T: BoundType, F: Foo<T>> { method(arg: T) { // 这里可以正常使用T类型 } }
这种方案的好处是T是显式的,如果你需要在Class的多个方法或属性中用到T,代码可读性会更高。
方案二:从F中提取T类型,无需额外泛型参数
利用Flow的$ElementType工具类型,直接从F的bar属性中提取出对应的T类型,这样Class只需要一个泛型参数F,完全不用重复声明T:
type BoundType = { /* 你的约束定义 */ }; type Foo<T: BoundType> = { bar: T }; class Class<F: Foo<*>> { method(arg: $ElementType<F, 'bar'>) { // arg的类型就是Foo中定义的T,自动继承BoundType约束 } }
这里Foo<*>表示F可以是任意满足Foo结构的类型,而$ElementType<F, 'bar'>会精准提取出F.bar的类型——也就是你原本想复用的T。这种方案更简洁,适合只需要在少数地方用到T的场景。
两种方案都能避免重复声明T的约束,你可以根据自己的代码结构和可读性需求来选择~
内容的提问来源于stack exchange,提问作者SMuzTopix
相关产品推荐
相关产品推荐

