Flow:使用不相交的联合和$ Shape匹配参数类型

时间:2017-06-16 19:06:18

标签: flowtype

我想创建一个函数,将T类型的对象与T中也找到的属性子集合并。例如,给出以下定义:

type Animal<Type: $Subtype<string>, Props: {}> = {
  name: string,
  type: Type,
} & Props;

type Cat = Animal<'CAT', {
  fuzzy: boolean,
}>;

type Dog = Animal<'DOG', {
  adventurous: boolean,
}>;

我希望有一个动物,它可以获取动物,动物的一些子属性,并返回另一个与输入动物的形状相匹配的物体。

我尝试了以下内容:

function augmentAnimal<T: Cat | Dog>(
  animal: T,
  augmentation: $Shape<T>,
): T {
  return {
    ...animal,
    ...augmentation,
  };
}

这给了我以下错误:

20:   return {             ^ object literal. Could not decide which case to select
16: function augmentAnimal<T: Cat | Dog>(
                              ^ union type

我认为我很困惑的部分是让函数能够采用任何Animal类型,然后强制augmentation参数的类型为$Shape<OnlyOneAnimal>而不是$ Shape`。

我可以为每只动物单独创建增强功能:

function augmentCat<T: Cat>(
  cat: T,
  catProps: $Shape<T>,
): T {
  return {
    ...cat,
    ...catProps,
  };
}

我似乎无法弄清楚更通用的版本。

注意:动物增强仅用于说明目的。在创建这个问题时,没有动物被增加或伤害。

1 个答案:

答案 0 :(得分:1)

听起来像是对我的继承。接口会有帮助吗?

a[0]