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

Why empty object is valid for non exact type annotation in flow type?

我的意思是像这样的代码

const someObj: { id: number } = {};
const num: number = someObj.id;
console.log(num);

num这里是未定义的,绝对不是数字

可以在此处检查代码段 https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoAxnAdgZwC5g5wC2ApgPIBGAVgFxgDeYAlgCb1YCuxlpATmAC+YALyNBAbgzZ8YLsQ7deAsUTJVqAOjYSgA

这是一个 documented limitation 用于未密封的对象:

Unsealed objects allow new properties to be written at any time. Flow ensures that reads are compatible with writes, but does not ensure that writes happen before reads (in the order of execution).

This means that reads from unsealed objects with no matching writes are never checked. This is an unsafe behavior of Flow which may be improved in the future.

所以通常流程可以检查id是否写成数字,但不能检查id是否真的被写入了someObj

添加了一个问题,也有一些讨论 - https://github.com/facebook/flow/issues/8430