我想知道在typescript中是否有一种速记法来只为泛型类型指定一些可选类型。例如,如果我有一个带有可选类型的类:
class GenericClass<A extends Type1 = Type1, B extends Type2 = Type2, C extends Type3 = Type3>
然后我想定义一个子类,比如:class Subclass extends GenericClass<TypeB>
,这是class Subclass extends GenericClass<Type1, TypeB, Type3>
的简写,但它不起作用。相反,它试图将TypeB
推断为Type1
的子类型,这给出了错误。然而,在这个例子中也允许省略Type3
,让typescript推断它。类似这样的东西在定义通用的react组件时会很有用,在这里我想指定状态的类型,而不是props。
那么,在指定可选类型时必须提供前面所有的可选类型,我说的对吗?或者有没有办法做到我正在尝试的事情?
对于可选的函数参数,你可以指定undefined
作为前面的可选参数,这对泛型不起作用,但我尝试过,使用void
代替,但也不起作用。我还尝试使用像Subclass extends GenericClass<B = TypeB>
这样的语法,但也不起作用。
我看到一些用接口替换可选函数参数的建议,比如:
interface Args { a?: number, b?: string, c?: any}
function myFunc(Args) {}
然后可以像myFunc({b: "value"});
那样调用它,从而避免必须执行myFunc(undefined, "value");
。这似乎是一个糟糕的选择,但也许可以为泛型类型做类似的事情?我不确定那会是什么样子。
我尝试的另一件事是重载类型,如type GenericClass<B extends Type2> = GenericClass<Type1, B, Type3>
。这不起作用,除非我键入不同的名称,如GenericClassB
2条答案
按热度按时间waxmsbnn1#
TypeScript目前没有你正在寻找的功能,至少在TS5.1中是这样。Generic类型参数只有在它们有默认值时才能省略,并且不允许跳过任何参数。有几个开放的功能请求,如果实现,可能会做你想要的:
GenericClass<*, TypeB, *>
或GenericClass<_, TypeB, _>
等的内容。GenericClass<B=TypeB>
,或者在microsoft/TypeScript#54254中,你可以写GenericClass<B: TypeB>
或者GenericClass<{B: TypeB}>
。Args
类型,所有可选属性都可以工作,除了TypeScript无法从index access types推断;也就是说,它可以从类型为A
的值推断A
,但不能从类型为T["a"]
的值推断T extends {a: any}
。在microsoft/TypeScript#51612上有一个开放的特性请求,它可以做到这一点,但它还不是语言的一部分。最近提到的两个问题中的一个或两个可能有一些希望得到解决。事实上,在microsoft/TypeScript#53017上有一个pull请求,它实现了最后一个,但我不知道它是否会被合并。(microsoft/TypeScript#20126上的一个更老的pull请求也实现了它,但它被放弃了。
但在此之前,您需要使用变通方法。
acruukt92#
我不知道如何使用类来实现它,我通常只使用
type
,你可以这样做:Playground链接