【问题标题】:Dynamic property names in flow typed object流类型对象中的动态属性名称
【发布时间】:2017-06-29 16:39:08
【问题描述】:

我正在缓慢而坚定地在我的代码中使用 flowType,但我正在为一个概念而苦苦挣扎。

如何指定对象的未知、动态命名属性的类型?

例如,我的用户对象可能有一个包含具有唯一键的组织的对象。

我该如何定义?

export type User = ?{
  currentOrg: string,
  displayName?: string,
  email: string,
  emailVerified: boolean,
  newAccount: boolean,
  organisations?: {
     UNKNOWNKEY?: string {
       orgData1: string,
       orgData2: string,
     }
  },
  uid: string,
  photoUrl?: string,
};

非常感谢您对此的任何帮助。谢谢!

【问题讨论】:

  • 附带说明,在其定义中将您的类型定义为可为空的不是好习惯。您可能不希望 null 成为使用该类型的 User everywhere 的有效值。最好选择使User 的某些用法可以为空。例如type Bug = { createdBy: User, assignedTo: ?User }.
  • 非常感谢。是的,我回想起来也注意到了同样的事情,并创建了两种类型,NullableUser 和 DefiniteUser,它们具有 ?User 或 User 类型。这样,对于我的大部分代码,我都可以使用 DefiniteUser 类型。

标签: javascript syntax flowtype


【解决方案1】:

Flow 有 specific syntax 用于表现类似于地图的对象:

{ [key: K]: V }

K 是键的类型,V 是值的类型。

您的完整示例如下所示:

export type User = {
  currentOrg: string,
  displayName?: string,
  email: string,
  emailVerified: boolean,
  newAccount: boolean,
  organisations?: { [key: string]: string },
  uid: string,
  photoUrl?: string,
};

【讨论】:

    【解决方案2】:

    实际上,在 TypeScript 中,您可以为键使用名称,然后传递键的类型:

    type User = {
      [key: string | number]: string;
    };
    

    在 FlowType 中,您可以像 TypeScript 一样进行操作,也可以在没有示例名称的情况下进行操作:

    type User = {
      [string | number]: string,
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多