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)
我们是否可以省略定义任何泛型(它获得默认类型)而只定义我们需要的那些?我在谷歌上搜索了几个小时,但没有多少人像我一样有同样的想法,但回答并没有真正有帮助,有人可以给我看指南吗?
谢谢你!!!
我能想到的唯一方法是创建采用不同类型参数的子类。
我在下面举例说明了你的<,,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)