【问题标题】:FlowJS: How to use union types and boolean literalsFlowJS:如何使用联合类型和布尔文字
【发布时间】:2017-08-15 01:15:48
【问题描述】:

心流问题似乎很少得到答案,但这里是:

type Base = {
  foo: string,
  bar: string
}
type Derived1 = Base & {
  conditional: false
}
type Derived2 = Base & {
  conditional: true,
  baz: string
}

type One = {
  foo: string,
  bar: string,
  conditional: boolean
}
type Two = One & {
  baz: string
}

type Return1 = Derived1 | Derived2  // fails

type Return2 = One | Two  // works, but not desired

function test(conditional: boolean): Return1 {
  return {
    foo: "foo",
    bar: "bar",
    conditional,
    ...conditional ? {baz: "baz"} : {}
  }
}

test 的返回值最好是Derived* 类型之一(Return1 而不是Return2),其中conditional 属性是布尔文字。

目的是让流理解如果conditionaltrue,那么对象test 返回必须包含baz,反之亦然。

这不可能吗?

【问题讨论】:

    标签: javascript flowtype


    【解决方案1】:

    Flow 不够聪明,无法为您解决。您必须执行以下操作:

    function test(conditional: boolean): Return1 {
    
      const base = {
        foo: "foo",
        bar: "bar",
      }
    
      if (!conditional) {
        return Object.assign({}, base, { conditional });
      } else {
        const result: Derived2 = Object.assign({}, base, { conditional }, {baz: "baz"});
        return result;
      }
    }
    

    更多信息在这里:https://flow.org/blog/2016/07/01/New-Unions-Intersections/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 2018-08-27
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      相关资源
      最近更新 更多