Flowtype中Typescript的“ EnumType中的键”等效吗?

时间:2019-06-02 11:35:25

标签: typescript enums flowtype

Typescript允许我编写这样的代码:

export enum ActivityType {
  FREERIDE = "FREERIDE",
  SKI_TOUR = "SKI_TOUR",
}

const activityDesctription: {
  [key in ActivityType]: string
} = {
  [ActivityType.FREERIDE]: "Freeriding",
  [ActivityType.SKI_TOUR]: "Ski-touring"
};

in表达式为我提供了非常严格的类型安全性,即activityDesctription必须包含枚举的每个成员的定义,而不是更少,而不是更多。它还会生成适当的索引运算符。

如何在Flowtype中表达in表达式?

1 个答案:

答案 0 :(得分:1)

更新的答案

如果您想让activityDescriptionActivityType完全相同,并在缺少某些内容时抱怨,请使用$ObjMap({{3 }})。 docs

const ActivityType = {
  FREERIDE: "FREERIDE",
  SKI_TOUR: "SKI_TOUR",
}

type StringValue = <V>(V) => string
const activityDescription: $ObjMap<typeof ActivityType, StringValue> = {
  [ActivityType.FREERIDE]: 'yo',
  [ActivityType.SKI_TOUR]: 'this is fun',
}

旧答案

您可以使用$Keys<typeof obj>来提取obj的键。 Flow tryDocs

更新:如评论中所述,当ActivityType中缺少activityDescription的键时,此解决方案不会引发编译错误。

const ActivityType = {
  FREERIDE: "FREERIDE",
  SKI_TOUR: "SKI_TOUR",
}

const activityDescription: {
  [$Keys<typeof ActivityType>]: string
} = {
  [ActivityType.FREERIDE]: "Freeriding",
  [ActivityType.SKI_TOUR]: "Ski-touring",
  error: 'error' // flow errors here
};