Flow通用函数创建泛型类型

时间:2018-04-11 15:43:03

标签: javascript flowtype

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

/* @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'的类型,但它始终是相同的错误。

2 个答案:

答案 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

Flow Try link here