假设我有这种通用流类型:
/* @flow */
type Cat<T> = {
get:()=>T
};
我想创建一个创建猫的函数:
const makeCat:<U>(getter:()=>U)=>Cat<U>
= (getter) => ({get:getter});
流给我以下错误:
Cannot assign function to `makeCat` because `U` [1] is incompatible with `U` [2] in the return value of property `get` of the return value.
我尝试了几种不同的方法来定义“ getter”中传递的类型,但这始终是相同的错误。
最佳答案
尝试这个。我将其逻辑分解为几个额外的步骤,以使其更易于理解。该解决方案的关键部分是在使用*
函数时使用makeCat
告诉流程“填补空白”。
type Cat<T> = {
get: () => T
}
// define signature of "makeCat" function
type MakeCat<U> = (getter: () => U) => Cat<U>
// use * to infer the variable at usage
const makeCat: MakeCat<*> = getter => ({ get: getter })
// inferred as Cat<string>
const cat = makeCat(() => 'secret')
// inferred as string
const value = cat.get()