为什么`{a:string}`不能流入`{a ?: string}`

时间:2019-07-29 14:27:46

标签: javascript flowtype

给定对象类型lst1 <- do.call(Map, c(f = seq, unname(dates), by = "1 day")) table(do.call(c, lst1)) A,除了B的属性是可选的以外,两者都相同……为什么不能A用于{ {1}}被接受了吗?

B

Flow try link here

2 个答案:

答案 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!

Try Flow

答案 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)

此转换失败。