微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决推断打字稿中嵌套的泛型类型?

假设我有

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。