问题描述
我正在尝试使用 Flow 输入一个将 As 映射到 Bs 的函数,其中唯一的限制是:
除此之外,A 可以是任何对象,在这种情况下,B 是众所周知的。 我想用泛型/多态类型键入函数,以便类型检查器知道您将获得包含匹配的 A 和 B 的对象数组。
我在下面的尝试没有给我任何类型错误,但我认为它也不正确。 很想了解如何正确键入此内容,以便您获得最大的保证。
type B = {A: {id: string}}
const BContainsA = (id: string) => (b: B) =>
b.A.id === id
type MapResult<T> = {
AsWithBs: Array<{ A: T,B: B }>,AsWithoutBs: string[],}
const mapAsToBs = <T>(
As: { ...T,id: string }[],Bs: B[]
): MapResult<T> => {
return As.reduce(
(result,a) => {
const b = Bs.find(BContainsA(a.id))
if (!b) {
result.AsWithoutBs.push(a.id)
return result
}
result.AsWithBs.push({ A: a,B: b })
return result
},{ AsWithBs: [],AsWithoutBs: [] }
)
}
mapAsToBs([{pos:2,id: '1'},{pos:1,id: '11'}],[{A:{id: '1'}}])
解决方法
似乎我所要做的就是为泛型类型添加一个约束,如下所示:
const mapAsToBs = <T:{id: string}>(
As: T[],Bs: B[]
): MapResult<T> => {
}
它是indeed documented,但语法太不直观,解释太短,我只是阅读它是猜不出来的。
您可以检查它是如何按预期工作的here