对象文字。不精确类型与确切类型不兼容(没有对象传播)

时间:2017-10-19 22:59:41

标签: javascript flowtype

在下面的情况下,Flow可以正确使用精确类型:

type Something={|a: string|};
const x1: Something = {a: '42'};        // Flow is happy
const x2: Something = {};               // Flow correctly detects problem
const x3: Something = {a: '42', b: 42}; // --------||---------

...但是Flow也抱怨如下:

type SomethingEmpty={||};
const x: SomethingEmpty = {}; 

消息是:

object literal. Inexact type is incompatible with exact type

这与this one的情况不同,因为没有使用点差。

使用最新的0.57.3进行测试。

1 个答案:

答案 0 :(得分:1)

没有属性的Object文字在Flow中被推断为未密封的对象类型,也就是说您可以向此类对象添加属性或解构不存在的属性而不会引发错误:

// inferred as...

const o = {}; // unsealed object type
const p = {bar: true} // sealed object type

const x = o.foo; // type checks
o.bar = true; // type checks

const y = p.foo; // type error
p.baz = true; // type error

Try

要将空Object字面值键入为没有属性的确切类型,您需要明确地将其密封:

type Empty = {||};
const o :Empty = Object.seal({}); // type checks

Try