假设我有这种通用流类型:

/* @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()

10-04 15:39