问题描述
假设我有
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>>