现在我有三个课程,A
,B
和C
。
B
从A
延伸。 C
可能会从A
或B
延伸。
如何编写C类代码?
是否有类似的内容:
class C extends <T>{...}
T
只会是A
或B
。在编译时决定是A
还是B
。
答案 0 :(得分:0)
是否有
之类的内容document.getElementById('btn').addEventListener('click',function(){ var checkboxes = document.getElementsByName('checkval[]'); var input = document.getElementsByName('ocid[]'); var checkval = ''; var checkid = ''; for(var i=0;i<checkboxes.length;i++) { if(checkboxes[i].checked){ i==0 ? checkval += checkboxes[i].value : checkval += ","+checkboxes[i].value; i==0 ? checkid += input[i].value : checkid += ","+input[i].value; } } console.log(checkval+" "+checkid); });
不,没有。
您可以创建class C extends <T>{...}
和CA extends A
,并在运行时选择两者
答案 1 :(得分:0)
你不能用泛型来做。您可以使用与mixin classes类似的模式执行此操作,但它涉及到相关内容,并要求您描述将C
添加到A
或B
的类A | B
一个单独的接口,然后有一个函数,使用A或B作为参数构造和返回类定义。您还必须为该函数提供2个单独的重载声明,因为基本上不可能声明扩展除类之外的任何类的类 - 您不能使用联合类型class A { a: string }
class B extends A { b: string }
interface C_only { // decsribes what C will add to either A or B
c: number;
}
interface C_extended_from_A {
new (): C_only & A;
}
interface C_extended_from_B {
new (): C_only & B;
}
function extend_A_or_B(Base: typeof B): C_extended_from_B;
function extend_A_or_B(Base: typeof A): C_extended_from_A;
function extend_A_or_B(Base: typeof A): typeof A {
return class C extends Base implements C_only {
constructor() {
super();
// can access only methods from common base class A in the implementation
this.c = this.a.length;
}
c: number;
}
}
const CA = extend_A_or_B(A);
const CB = extend_A_or_B(B);
const ca = new CA();
const cb = new CB();
const a1 = ca.a;
//const b1 = ca.b // error - no b here
const c1 = ca.c;
const a2 = cb.a;
const b2 = cb.b;
const c2 = cb.c;
。
{{1}}
不确定它是否能解决您的问题,或者是否值得拥有这样的复杂性,但现在就是这样。