给定对象类型lst1 <- do.call(Map, c(f = seq, unname(dates), by = "1 day"))
table(do.call(c, lst1))
和A
,除了B
的属性是可选的以外,两者都相同……为什么不能A
用于{ {1}}被接受了吗?
B
答案 0 :(得分:1)
我认为Flow试图警告说,如果将x
输入为A
,则有可能对其进行修改,使其仍然满足A
的类型定义,但不能满足B
的类型定义。例如,如果a
可能会违反x: A
,则可以删除B
属性。
我通过创建A
的新“只读”版本并将其投射为x
来进行测试。
type Required = { a: string};
type Optional = { a?: string };
type ReadOnlyOptional = $ReadOnly<Optional>;
const x: Required = { a: '' };
(x: Optional); // error
(x: ReadOnlyOptional); // no error!
答案 1 :(得分:0)
要能够执行类型转换,必须将要转换的类型包含在当前类型的类型定义中。
在这种情况下
type A = { a?: string };
type B = { a: string };
由于类型定义不匹配,因此无法转换A> B或B> A的这些类型。
如果您定义了以下类型:
type A = { a?: string };
type B = { a?: string, b: number };
您可以从B型转换为A型
const x: B = { a: '...', b: 1 };
(x: A)
const x: B = { b: 1 };
(x: A)
这些是有效的,因为类型B中包含了类型A。
但是您不能从类型A强制转换为类型B,因为类型B中不包含类型A定义。
const x: A = { a: '...' };
(x: B)
此转换失败。