我想知道是否有一种简写方式可以在打字稿中为泛型类型仅指定一些可选类型。例如,如果我有一个带有可选类型的类:
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
并让打字稿推断它。这样的东西对我定义通用反应组件很有用,我想在其中指定状态类型,而不是道具。
我是否正确,在指定可选类型时必须提供所有前面的可选类型。或者有什么办法可以像我尝试的那样吗?
对于可选函数参数,您只需为前面的可选参数指定
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
不知道如何进行课程,我通常只使用
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,...