Dart是否支持命名导出?如何实现按模块分组导出导入类?
Dart实现命名空间导出的两种可行方案
Dart原生确实不支持export语句搭配as关键字做命名空间导出,不过可以通过以下两种常用方案实现你要的按模块区分的引用效果:
方案1:分别导入子文件指定别名(官方推荐)
不需要依赖统一入口文件,直接在使用侧导入对应子模块时添加别名即可,无额外开发维护成本,是Dart官方推荐的做法:
// outside.dart import 'package:my_types/models.dart' as models; import 'package:my_types/repositories.dart' as repositories; class ModelAImpl implements models.ModelA {} class RepositoryBImpl implements repositories.RepositoryB {}
优缺点
- 优点:零额外封装代码,运行无性能损耗,不需要维护统一入口的映射关系
- 缺点:需要导入多个文件,无法通过单一入口引入所有模块
方案2:统一入口手动封装命名空间
如果你需要保留main.dart作为唯一导出入口,可以在入口文件中手动封装命名空间层:
// main.dart import 'models.dart' as models_impl; import 'repositories.dart' as repos_impl; // 封装models命名空间 abstract class models { typedef ModelA = models_impl.ModelA; typedef ModelB = models_impl.ModelB; } // 封装repositories命名空间 abstract class repositories { typedef RepositoryA = repos_impl.RepositoryA; typedef RepositoryB = repos_impl.RepositoryB; }
封装完成后使用侧的写法完全符合你的预期,仅需导入一个入口文件即可按模块引用:
// outside.dart import 'package:my_types/main.dart'; class ModelAImpl implements models.ModelA {} class RepositoryBImpl implements repositories.RepositoryB {}
优缺点
- 优点:支持单一入口导入,完全实现你需要的按模块区分的引用结构
- 缺点:子模块新增类时需要同步在入口的命名空间封装中添加typedef映射,有少量维护成本,类数量多的情况下可以写脚本自动生成映射代码降低维护量
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

