无法获得宽度子类型以使用确切类型

问题描述

我通过“传播” 2种确切的类型来创建类型:

-B

我不明白为什么我不能按如下方式进行宽度子类型化:

type Type1 = {|foo: number|};
type Type2 = {|bar: string|};
type Both = {|...Type1,...Type2|};

我收到此错误

var a: Both = {foo: 42,bar: 'baz'};

function fooTest(arg: Type1) {
    console.log(arg.foo);
}

fooTest(a);

但是从this page,我得知我被允许传递额外的属性,但似乎确切的类型阻止了这种行为。

正确的方法是什么?

Try it

编辑: 感谢@Aleksey L.的指针,我最终将函数的参数类型转换为不精确的参数:

../\-:11: fooTest(a);
                  ^ Cannot call `fooTest` with `a` bound to `arg` because property `bar` is missing in `Type1` [1] but exists in `Both` [2]. [prop-missing]
References:
../\-:7: function fooTest(arg: Type1) {
                               ^ [1]
../\-:5: var a: Both = {foo: 42,bar: 'baz'};
                ^ [2]

解决方法

否,将具有“额外”属性的对象传递给确切的对象类型是无效的

确切的对象类型会禁用宽度子类型,并且不允许存在其他属性。

更多信息here