打字稿:如何在多个泛型类上跳过定义类型

Rue*_*eta 5 javascript generics types class typescript

我是 Typescript 的新手,仍在学习。使用 TS 时,我遇到了以下情况:我的类具有多个这样定义的泛型属性

export class MainClass<
    A = string,
    B = number,
    C = boolean> {
    propA: A
    propB: B
    propC: C
}
Run Code Online (Sandbox Code Playgroud)

如果我调用它并定义完整的 3 种类型,它可以正常工作:

let mainClass = new MainClass<string, string, string>
Run Code Online (Sandbox Code Playgroud)

但后来我想创建新实例,只想定义第 3 种类型:

let mainClass2 = new MainClass< , ,custom-type>
Run Code Online (Sandbox Code Playgroud)

我们是否可以省略定义任何泛型(它获得默认类型)而只定义我们需要的那些?我在谷歌上搜索了几个小时,但没有多少人像我一样有同样的想法,但回答并没有真正有帮助,有人可以给我看指南吗?

谢谢你!!!

Fen*_*ton 4

我能想到的唯一方法是创建采用不同类型参数的子类。

我在下面举例说明了你的<,,type>例子。类型注释只是为了向您展示您(有效)获得的内容 - 您不需要在现实生活中在这里添加注释。

class MainClass<A = string, B = number, C = boolean> {
    propA: A
    propB: B
    propC: C
}

class MainClassB<
    C = boolean> extends MainClass<string, number, C> {
}

let example1: MainClass<string, string, string> = new MainClass<string, string, string>();

let example2: MainClass<string, number, number> = new MainClassB<number>();
Run Code Online (Sandbox Code Playgroud)

基本概念是子类采用您想要的类型参数的任何组合,并返回具有 的三个属性的类MainClass。如果您想支持各种一两种默认情况(消除原始类型参数顺序可以满足的组合),您可以创建各种组合。

完整示例

我已经插入了一个函数,该函数接受MainClass显示所有结果类型在结构上是兼容的:

class MainClass<A = string, B = number, C = boolean> {
    propA: A
    propB: B
    propC: C
}

class MainClassC<C> extends MainClass<string, number, C> {
}

class MainClassAC<A, C> extends MainClass<A, number, C> {
}

class MainClassBC<B, C = boolean> extends MainClass<string, B, C> {
}

function processMainClass(input: MainClass) {
    console.log(input.propA, input.propB, input.propC);
}

let a = new MainClass<string>();
processMainClass(a);

let b = new MainClassBC<number>();
processMainClass(b);

let c = new MainClassC<boolean>();
processMainClass(c);

let ab = new MainClass<string, number>();
processMainClass(ab);

let ac = new MainClassAC<string, boolean>();
processMainClass(ac);

let bc = new MainClassBC<number, boolean>();
processMainClass(bc);

let abc = new MainClass<string, number, boolean>();
processMainClass(abc);
Run Code Online (Sandbox Code Playgroud)