我认为我的问题很简单,但我无法在任何地方找到答案。
我想要检查一个函数,但我似乎无法将返回类型绑定到输入类型。
假设我有一副键入的牌,我想要一个(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也可以实现。
答案 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