Javascript 为什么空对象对流类型中的非精确类型批注有效?

Javascript 为什么空对象对流类型中的非精确类型批注有效?,javascript,flowtype,Javascript,Flowtype,我的意思是像代码一样 const someObj: { id: number } = {}; const num: number = someObj.id; console.log(num); num这里没有定义,肯定不是数字 可以在此处检查代码段 这是一个用于未密封对象的示例: 未密封的对象允许随时写入新属性。Flow确保读操作与写操作兼容,但不确保写操作发生在读操作之前(按照执行顺序) 这意味着从不检查从未密封对象中读取且没有匹配写入的内容。这是一种不安全的流量行为,将来可能会得到改进 因

我的意思是像代码一样

const someObj: { id: number } = {};
const num: number = someObj.id;
console.log(num);
num
这里没有定义,肯定不是数字

可以在此处检查代码段

这是一个用于未密封对象的示例:

未密封的对象允许随时写入新属性。Flow确保读操作与写操作兼容,但不确保写操作发生在读操作之前(按照执行顺序)

这意味着从不检查从未密封对象中读取且没有匹配写入的内容。这是一种不安全的流量行为,将来可能会得到改进


因此,正常情况下,flow可以检查
id
是否写为数字,但不能检查
id
是否实际写入了
someObj

添加了一个问题,也有一些讨论-

这个问题是关于不精确类型的。。这与密封/未密封无关,因为类型是显式指定的,而不是inferred@AlekseyL. 我只是说流是如何工作的(默认情况下对象是不精确的),以及为什么这个特定的示例对流是有效的。如果你看到一个更好的答案,那就发吧;)若要解封对象,
someObj.foo='foo'将被允许。但密封/未密封与问题的关系并非如此?看起来像是一个带有空对象文本的bug,谢谢,这是有意义的(仍然与奇怪的行为有关)