为什么只读对象需要对象中的可选属性?
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
定义为一个对象,其 属性 var1
为 number
并且所有其他属性为 未知 .
例如:
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
.
这是我的示例代码:
/* @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
定义为一个对象,其 属性 var1
为 number
并且所有其他属性为 未知 .
例如:
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
.