在typescript中只为泛型类型提供一些类型

e0bqpujr  于 2023-06-07  发布在  TypeScript
关注(0)|答案(2)|浏览(322)

我想知道在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

waxmsbnn

waxmsbnn1#

TypeScript目前没有你正在寻找的功能,至少在TS5.1中是这样。Generic类型参数只有在它们有默认值时才能省略,并且不允许跳过任何参数。有几个开放的功能请求,如果实现,可能会做你想要的:

  • microsoft/TypeScript#26242中有 partial type argument inference。该提案的一部分是允许“符号”或“占位符”类型,以便您可以编写类似GenericClass<*, TypeB, *>GenericClass<_, TypeB, _>等的内容。
  • microsoft/TypeScript#38913中也有 named type arguments,你可以写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请求也实现了它,但它被放弃了。
但在此之前,您需要使用变通方法。

acruukt9

acruukt92#

我不知道如何使用类来实现它,我通常只使用type,你可以这样做:

type Tuple3<a,b,c> = [a,b,c]

const t3: Tuple3<number, string, string> = [3, 'apple', 'banana']

type NamedTuple2<a,b> = Tuple3<string,a,b>

const namedT2: NamedTuple2<number, string> = ['fruites', 2,...

Playground链接

相关问题