Flow中两种对象类型定义语法{}与{|}的区别是什么
Flow两种对象类型定义语法差异
普通{}语法:开放对象类型
- 该写法声明的是开放对象类型,仅校验定义中存在的属性类型,允许对象携带未在类型中声明的额外属性,Flow不会对额外属性做校验。
- 代码示例:
type User = { name: string } // 以下代码不会报错,额外的age属性不会被校验 const user: User = { name: '张三', age: 25 }
- 适用场景:需要兼容未知额外属性、或者要做对象类型继承扩展的场景。
{| |}语法:精确对象类型
- 该写法声明的是精确对象类型,会严格限制对象的结构,只能包含类型定义中声明的属性,只要出现未声明的属性,Flow会直接抛出类型错误。
- 代码示例:
type ExactUser = {| name: string |} // 以下代码会报错,提示age不属于ExactUser的定义属性 const user: ExactUser = { name: '张三', age: 25 }
- 补充说明:如果你的Flow配置开启了
exact_by_default=true,那么普通{}定义的对象类型默认也会按精确对象处理,此时如果需要声明开放对象,需要主动添加...标记:type OpenUser = { name: string, ... }。
内容的提问来源于stack exchange,提问作者Massimiliano。
相关产品推荐
相关产品推荐

