假设我有这种通用流程类型:
/* @flow */
type Cat<T> = {
get:()=>T
};
我想创建一个创建猫的函数:
const makeCat:<U>(getter:()=>U)=>Cat<U>
= (getter) => ({get:getter});
Flow给出了以下错误:
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'的类型,但它始终是相同的错误。
答案 0 :(得分:1)
试试这个。我把它的逻辑分解为一些额外的步骤,使其更容易理解。此解决方案的关键部分是使用*
告诉流程在使用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()
答案 1 :(得分:0)
基于@kindaro的回答,但简化为不必定义中间函数类型,只需使用常规的“old-school”函数声明表单:
type Cat<T> = { get: () => T };
function makeCat<U>(getter: () => U): Cat<U> {
return { get: getter };
}
// inferred as Cat<string>
const cat: Cat<string> = makeCat(() => 'secret');
// const cat: Cat<number> = makeCat(() => 'secret'); // Yields error
// inferred as string
const value: string = cat.get();
// const value: number = cat.get(); // Yields error