将具有强制属性的对象转换为具有相同可选属性的对象

时间:2018-07-03 11:15:02

标签: javascript flowtype

我正在努力解决以下问题为何不起作用:

/* @flow */

type A = {
  foo: string
}

type B = {
  foo?: string
}

const a: A = { foo: 'bar' };
const b: B = (a: B);

流给我:

12: const b: B = (a: B);
                  ^ Cannot cast `a` to `B` because string [1] is incompatible with undefined [2] in property `foo`.
References:
4:   foo: string          ^ [1]
8:   foo?: string           ^ [2]

我要做的就是将一个保证存在属性的对象转换为一个可能存在可能的对象-这样行吗?

Try Flow link here(不知道它将工作多长时间)

1 个答案:

答案 0 :(得分:1)

因为可以将nullundefined写入b.foo,所以可以这样做:

b.foo = null
console.log(a.foo) // null

很显然,我们不希望a.foo为null,因此Flow会警告您遇到的错误。为了防止发生此错误(并满足Flow的类型检查),您可以将B的foo属性标记为read only(也称为“ covaiant”),然后分配有效(我们不会意外覆盖foo道具)。

这里有很多实际的例子:

Try

type A = {
  foo: string
}

type B = {
  foo?: string
}

const a: A = { foo: 'bar' };

// Example 1: Both readonly
const b: $ReadOnly<B> = (a: $ReadOnly<B>);

// Example 2: Just b readonly
const b_readonly_from_writeable1: $ReadOnly<B> = a

type A_ReadOnly = {
  +foo: string // Just the foo property is covariant
}

// Alt forms:
// type A_ReadOnly = $ReadOnly<A>
// or
// type A_ReadOnly = $ReadOnly<{
//   foo: string
// }>

type B_ReadOnly = {
  +foo?: string
}

// Example 3: both readonly at type declaration
const a_readonly: A_ReadOnly = a
const b_readonly: B_ReadOnly = a_readonly;

// Example 4: assigning a writeable object to a readonly one
const b_readonly_from_writeable2: B_ReadOnly = a;