【问题标题】:How do I generate a type for a nested object that has been flattened?如何为已展平的嵌套对象生成类型?
【发布时间】:2020-02-25 04:14:20
【问题描述】:

我正在尝试使用这样的嵌套对象类型:

type Numbers = {
  numberOfCategories: number,
  colors: {
    numberOfColors: number
  },
  cars: {
    numberOfCars: number
  }
}

并自动生成一个扁平版本的类型,如下所示:

type FlattedNumbers = {
  numberOfCategories: number,
  numberOfColors: number
  numberOfCars: number
}

我认为这样的事情可以解决问题,但它并没有像我预期的那样工作:

type Numbers = {
  numberOfCategories: number,
  colors: {
    numberOfColors: number
  },
  cars: {
    numberOfCars: number
  }
}

type ConvertToObjects =
    & (<K, V:Object> (K, V) => V)
    & (<K, V> (K, V) => { K: V })


type Flattened = { ...$Values<$ObjMapi<Numbers, ConvertToObjects>> };

let test = ({
      numberOfCategories: 2,
      numberOfColors: 5,
      numberOfCars: 10
}: Flattened)

我收到以下错误消息:

// 15: type Flattened = { ...$Values<$ObjMapi<Numbers, ConvertToObjects>> };
//                                   ^ number [1] is not an object.
// References:
// 2:   numberOfCategories: number,
//                          ^ [1]

我的目标是拥有一个与Flattened 功能相同且能正常工作的功能。

我在这里做了一个起点: flow playground

【问题讨论】:

    标签: javascript flowtype


    【解决方案1】:

    这似乎已在 a recent commit 中修复,自从您发布此问题以来,它已作为错误修复在 Flow v0.111.1 中发布。您的 Playground 链接在最新版本上没有显示任何错误,但在使用 v0.111.0 时仍然会出现。

    【讨论】:

    • 有趣。虽然看起来错误消息消失了,但它仍然没有实现正确的类型目标。它没有验证展平类型是否正确。见new playground
    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 2017-01-21
    • 2021-11-06
    • 2018-10-24
    • 2017-07-02
    • 2020-12-22
    • 2021-10-19
    • 2020-06-23
    相关资源
    最近更新 更多