为什么只读对象需要对象中的可选属性?

Why are optional properties in an object required for a ReadOnly object?

这是我的示例代码:

/* @flow */

type A = {
    var1 : number,
}

type B = $ReadOnly<{
    var1 : number,
    var2? : string,
}>

let v : A = { var1: 1 };
let w : B =  v;

以及流程错误:

    13: let w : B =  v;
                     ^ Cannot assign `v` to `w` because property `var2` is missing in `A` [1] but exists in object type [2].
        References:
        12: let v : A = { var1: 1 };
                    ^ [1]
        13: let w : B =  v;
                    ^ [2]

我知道通常不能将 A 转换为 B,因为这样可以分配 v.var2。我的想法是让 B ReadOnly 可以防止这种情况。所以我不明白这种演员阵容会成为问题的情况。

这里的问题是

type A = {
    var1: number,
};

意味着将 A 定义为一个对象,其 属性 var1number 并且所有其他属性为 未知 .

例如:

type A = {
    var1: number,
};
type C = {
    var1: number,
    var2: boolean,
};

let c: C = { var1: 1, var2: true };
let a: A = c;

有效,因为 A 类型与 C 兼容。

但是,如果我们随后添加了类似于您的代码的片段:

type B = {
    var1: number,
    var2?: string,
};
let b: B = a;

这会将 b.var2 视为 string|void 而实际上它是 boolean 因为 b === c.