流类型对象中的动态属性名称

Posted

技术标签:

【中文标题】流类型对象中的动态属性名称【英文标题】: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 类型。 【参考方案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,
;

【讨论】:

以上是关于流类型对象中的动态属性名称的主要内容,如果未能解决你的问题,请参考以下文章

HQLhibernate查询语言hql

如何检查 C# 中的动态匿名类型上是不是存在属性?

动态创建匿名类型? [复制]

如何修复 React 中的“类型错误:尝试访问对象的属性时无法读取未定义的属性名称”

TypeScript 条件类型和计算对象属性名称

Typescript 从名称中获取对象属性类型