【问题标题】:Flow Type: Get object property names based on flow-types流类型:根据流类型获取对象属性名称
【发布时间】:2018-09-22 00:41:20
【问题描述】:

假设我有以下类型:

declare interface SomeClass {
    x?: ?number;
    y?: ?string;
}

现在我将此类型应用于对象 SomeObject,该对象将从后端调用中获取。问题是,有时返回的值会是这样的:

{ "x": 1, "y": "Some String", "z": "Additional Payload" }

问题是:如何使用 Flow删除这些所谓的额外负载?或者这不可能?

【问题讨论】:

  • 为什么在xy 键中使用??如果z键有时可能出现或不出现,请使用?符号。
  • 嗯,需要删除密钥z。有时还有更多的附加键,如z1z2 等。我想要的是一个只包含xy 的干净对象。这可以使用 Flow 完成还是我应该尝试其他方法?
  • 我认为您必须从对象中选择所需的键。 Flow 没有这些功能。

标签: javascript flowtype


【解决方案1】:

不,您无法通过流移除额外的有效负载。由于 flow 只是一个静态类型检查器,所有的 flow 语句都将被删除以供您运行 JavaScript 文件。但是您可以使用类似的方法来删除其余的有效负载:

const { x, y } = object;
object = { x, y };

【讨论】:

    【解决方案2】:

    Flow 是一种静态描述 JavaScript 代码的类型级语言。它没有运行时影响,也不会改变代码的含义——如果你从(正确键入的)程序中删除 Flow 注释,那么它将运行完全相同。这是 Flow 的设计目标之一,将其与 TypeScript 等语言区分开来。

    考虑到这一点,Flow 显然无法帮助您更改对象的结构。但是,如果您为一个对象分配一个只有某些字段的类型,Flow 可以帮助确保您不使用不应该使用的字段:

    type MyType = {
        x?: ?number,
        y?: ?string
    }
    let foo: MyType = { "x": 1, "y": "Some String", "z": "Additional Payload" };
    
    foo.z; // ERROR! Even though z is there, it's not part of MyType
    

    但是假设您希望它更早地更严格,并且不允许在分配中使用任何其他属性。您可以使用{| .. |} 表示不允许其他字段:

    type MyType = {|
        x?: ?number,
        y?: ?string
    |}
    let foo: MyType = { "x": 1, "y": "Some String", "z": "Additional" }; // ERROR!
    

    请注意,如果数据来自外部来源,您仍需要检查数据的结构。 Flow 只能使用编译时信息。

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 2021-03-18
      • 2020-03-17
      • 2018-06-28
      • 2023-03-14
      • 2017-09-14
      • 2016-11-03
      • 2021-12-04
      • 2010-09-24
      相关资源
      最近更新 更多