推断打字稿中嵌套的泛型类型?

问题描述

假设我有

interface Animal {}

interface Group<A extends Animal> {}

我想使接口在Group上通用

interface AnimalGroupProps<G extends Group<A>,A extends Animal> {
  withGroup: () => G
  // We want to be able to reference A in the interface,for use like this:
  withleader: () => A
}

我希望动物道具在组类型上通用。但是A 延伸动物似乎多余。我想说:

interface AnimalGroupProps<G extends Group<A>>

让TypeScript弄清楚。但是TypeScript希望声明A,所以我 必须使用先前代码段的模式。

class Wolf implements Animal {}

class WolfPack implements Group<Wolf> {}

function AnimalPlanetWolves ({withGroup,withleader}: AnimalGroupProps<WolfPack,Wolf>) {}
//                          This is the really annoying part --------------------^^^^

AnimalGroupProps的所有用户都必须指定两个通用参数,甚至 尽管其中之一是完全多余的。在我的实际代码库中,这将是 很多冗余。


在上面的示例中,WolfPack不是通用类型。如果有一个 您想传递给AnimalGroupProps的通用类型?实际上甚至 更糟:

interface Flock<A extends Animal> extends Group<A> {}

class Geese implements Animal {}

function AnimalPlanetBirds ({withGroup,withleader}: AnimalGroupProps<Flock<Geese>,Geese>) {}

解决方法

是的,Typescript具有推断嵌套类型的语法。

type AnimalForGroup<G> = G extends Group<infer A> ? A : never

您仍然需要在模板参数中列出A,但您可以为其指定默认值:

interface AnimalGroupProps<G extends Group<A>,A extends Animal = AnimalForGroup<G>>