Dart是否支持复合泛型隐式推导,减少泛型参数显式声明冗余?
Dart 泛型简化方案
Dart语法不支持你示例中直接在泛型边界内嵌声明未定义泛型参数的写法,但可以通过以下两种方案实现无需每次显式声明全部泛型参数的需求:
方案1:通过类型萃取定义单泛型别名
Dart 2.15及以上版本支持泛型类型萃取,可以先定义工具类型从ModularPage子类中提取关联的参数类型,再封装简化的泛型别名:
// 从ModularPage子类中萃取对应的参数泛型类型 typedef PageParamsOf<T extends ModularPage<PageParameters>> = T extends ModularPage<P> ? P : Never; // 仅需传入ModularPage子类类型的简化别名 typedef ModularRouteFor<T extends ModularPage<PageParameters>> = ModularRoute<PageParamsOf<T>, T>;
使用时只需要传入一个泛型参数即可:
// 等价于原来的ModularRoute<SomePageParameter, SomeModularPage>(...) ModularRouteFor<SomeModularPage>(...);
方案2:利用构造函数泛型自动推导
绝大多数场景下不需要显式指定泛型参数,只要传入的createPage参数有明确的类型信息,Dart编译器会自动推导出两个关联泛型的具体类型:
// 编译器会自动根据createPage的返回类型推导泛型为<SomePageParameter, SomeModularPage> ModularRoute( module: yourModule, route: '/some-page', createPage: (Map<String, String?> params) => SomeModularPage(params), );
如果匿名函数上下文类型信息不足,只需要给函数返回值加上明确的类型标注即可触发推导。
内容的提问来源于stack exchange,提问作者James Hancock
相关产品推荐
相关产品推荐

