运行TypeORM CLI时Babel-node/ts-node无法处理TS导入的Flowtype文件求助
问题解答
1. Metro处理混合语法导入的逻辑
Metro默认使用的metro-react-native-babel-preset内置了Flow语法自动识别能力:只要JS文件头部携带// @flow注解,Babel就会自动调用Flow语法剥离插件处理类型注解,再完成后续转译。此外Metro处理依赖时默认会对React Native生态的相关依赖做全量转译,不会跳过node_modules内的Flow文件,因此在APP运行时不会出现语法报错。
你在本地Node环境运行ts-node、babel-node时默认不会转译node_modules内的文件,因此遇到带Flow类型注解的JS文件就会抛出语法错误。
2. 实体文件是否应该移除外部导入
是的,这是TypeORM生态的通用最佳实践。ORM实体的核心职责是描述数据表结构和字段映射关系,属于纯数据层定义,不应该耦合任何业务逻辑、平台专属依赖(比如RN端的文件操作、设备信息API)。
建议你做代码拆分:实体文件只保留表结构定义和TypeORM装饰器,相关的文件操作、设备信息调用放到单独的service层文件中,导入实体完成业务逻辑即可。
3. 操作方式的问题
你当前的操作确实存在两处不合理的地方:
- 实体层职责越界,耦合了RN平台专属依赖,导致实体只能在RN环境运行,无法适配Node环境的TypeORM CLI
- 本地运行TypeORM CLI时,没有配置对node_modules内Flow依赖的转译规则
临时解决方案
如果暂时不想做代码拆分,可以新增一份CLI专用的Babel配置,主动处理Flow依赖的转译:
- 根目录新建
babel.config.cli.js:
module.exports = { presets: [ ['@babel/preset-env', { targets: { node: 'current' } }], '@babel/preset-typescript' ], plugins: [ ['@babel/plugin-proposal-decorators', { legacy: true }], '@babel/plugin-proposal-class-properties', '@babel/plugin-transform-flow-strip-types' ], overrides: [ { test: /node_modules\/(react-native-fs|react-native-device-info)/, plugins: ['@babel/plugin-transform-flow-strip-types'] } ] }
- 运行CLI时指定使用该配置:
BABEL_ENV=cli babel-node --config-file ./babel.config.cli.js ./node_modules/typeorm/cli.js migration:run
内容的提问来源于stack exchange,提问作者Arnaud de Mouhy
相关产品推荐
相关产品推荐

