Flow报错‘Property is missing in exports’的原因及正确语法咨询
解决Flow「Property MyType is missing in exports」错误的正确类型导入方式
你碰到的这个错误,核心原因很明确:Flow的类型定义属于静态检查标记,不是运行时存在的JS值,所以不能用CommonJS的require语法来导入——require是用来加载实际会在运行时执行的模块内容的,而MyType只是Flow用来做类型检查的“虚拟”标记,不会被编译成真实的JS代码。
下面是两种正确的解决方法,推荐第一种:
方法1:使用Flow专属的import type语法(推荐)
这是Flow设计的专门用来导入静态类型的语法,只会在静态检查阶段生效,不会影响运行时代码。
你的types.js代码不需要修改(已经用了export type正确导出类型),只需要把myfile.js的导入部分改成:
// myfile.js // @flow import type { MyType } from './types' // 正确的类型导入方式 const foo = ({ from = 'default', to, subject, text, }: MyType) => { doSomething(); }
方法2:CommonJS风格的间接导入(不推荐)
如果你的项目必须使用CommonJS风格,也可以通过typeof来间接引用类型,但这种写法不如第一种清晰,仅作参考:
// myfile.js // @flow const types = require('./types') type MyType = $PropertyType<typeof types, 'MyType'> // 间接获取类型 const foo = ({ from = 'default', to, subject, text, }: MyType) => { doSomething(); }
不过要注意,这种方法要求types.js里同时导出类型的运行时“占位”值(比如export const MyType = null),否则Flow还是找不到对应的属性,这就违背了类型只做静态检查的初衷,所以更推荐第一种方法。
总结一下:Flow的类型导入和普通JS模块导入是分开的,用import type来导入静态类型是最规范、最不容易出错的方式。
内容的提问来源于stack exchange,提问作者springloaded
相关产品推荐
相关产品推荐

