如何在Flow类型中指定空对象?Error或空对象变量场景
如何在Flow中指定变量为Error或空对象类型
首先,咱们来拆解你遇到的错误原因:
你用{||}(也就是$Exact<{}>的简写)来表示精确空对象类型,但Flow直接把{}字面量判定为非精确(开放)的空对象——这是Flow的默认行为:普通对象字面量是“开放”的,意味着你后续可以给它添加新属性,比如const obj = {}; obj.bar = 1;是被允许的。而{||}这种精确类型严格要求对象不能有任何额外属性,所以开放的空对象和精确空对象类型不兼容,Flow就抛出了错误。
正确的实现方式
有几种可靠的方法来达到你的需求(变量要么是Error对象,要么是严格的空对象):
1. 使用类型断言(Type Assertion)
直接把空对象字面量断言为精确空对象类型,明确告诉Flow这个对象不会被扩展:
const err: Error | {||} = ({}: {||});
2. 用Object.freeze创建不可变空对象
如果你的空对象不需要被修改,用Object.freeze冻结后,Flow会自动识别它符合精确空对象类型的要求:
const err: Error | {||} = Object.freeze({});
3. 定义类型别名(可选,提升可读性)
如果需要多次使用这个精确空对象类型,可以先定义一个别名,再使用:
type EmptyExactObj = {||}; const err: Error | EmptyExactObj = ({}: EmptyExactObj);
为什么不能直接用{}类型?
如果你尝试写const err: Error | {} = {};,Flow不会报错,但这个类型其实没有意义——因为{}在Flow里是所有对象类型的超类型,Error本身也是对象,所以Error | {}等价于{},无法起到区分“Error或空对象”的类型约束作用。
内容的提问来源于stack exchange,提问作者fraxture
相关产品推荐
相关产品推荐

