Flowtype返回值取决于输入

时间:2018-06-15 12:23:29

标签: flowtype

认为我的问题很简单,但我无法在任何地方找到答案。

我想要检查一个函数,但我似乎无法将返回类型绑定到输入类型。

假设我有一副键入的牌,我想要一个(imaginairy)返回类型,它取决于给定现有映射的输入。

具有功能的牌组:

type Suit = "diamonds" | "clubs" | "hearts" | "spades"

const suitMapping = {
  "diamonds": ["are", "forever"],
  "clubs": ["fabric", "fuse"],
  "hearts": ["she", "loves", "me"],
  "spades": ["lemmy", "loud"]
}

const suitToList = (suit: Suit) => {
  return suitMapping[suit]
}

例如,我知道 suitToList("diamonds")将返回["are", "forever"]。并且对象中的映射是固定的并且是计算机生成的。但是,如果有一种方法可以使用Flow对typepec进行贴图,我会很高兴。这样,如果某个地方有人想添加" motorhead"对于"黑桃",类型检查首先会失败,因此可以检查取决于输出的功能。

现在,我已经对它进行了测试,但在某些地方我觉得Flow也可以实现。

1 个答案:

答案 0 :(得分:0)

我找到了一种方法来检查这一点,但使用any。不是太干净的方式,但我认为这是一个流量错误。见https://github.com/facebook/flow/issues/2057#issuecomment-395412981

type Suit = "diamonds" | "clubs" | "hearts" | "spades"

type SuitMapping = {
  diamonds: string,
  clubs: number,
  hearts: Array<string>,
  spades: Array<string>,
}

const suitMapping: SuitMapping = {
  "diamonds": '',
  "clubs": 1,
  "hearts": ["she", "loves", "me"],
  "spades": ["lemmy", "loud"]
}

const suitToList = <K: Suit>(suit: K): $ElementType<SuitMapping, K> => {        
  return (suitMapping[suit]: any);
}

// suitToList('xxx'); // error
// const x: number = suitToList('diamonds'); // error
const y: string = suitToList('diamonds'); // works

flow try