Typescript 如何从泛型类扩展?
现在我有三门课,Typescript 如何从泛型类扩展?,typescript,Typescript,现在我有三门课,A,B和C B扩展自AC可以从A扩展,也可以从B扩展 如何为C类编写代码 是否有类似于: class C extends <T>{...} 类C扩展了{…} T将仅为A或B。它是A还是B取决于编译时 是否有类似类C扩展{…} 不,没有 您可以创建CA扩展A和CB扩展CB,并在运行时在两者之间进行选择 是否有类似类C扩展{…} 不,没有 您可以创建CA扩展A和CB扩展CB,并在运行时在两者之间进行选择您不能使用泛型。您可以使用类似于的模式来实现这一点,但它相当复杂,
A
,B
和C
B
扩展自A
C
可以从A
扩展,也可以从B
扩展
如何为C类编写代码
是否有类似于:
class C extends <T>{...}
类C扩展了{…}
T
将仅为A
或B
。它是A
还是B
取决于编译时
是否有类似类C扩展{…}
不,没有
您可以创建CA扩展A
和CB扩展CB
,并在运行时在两者之间进行选择
是否有类似类C扩展{…}
不,没有
您可以创建
CA扩展A
和CB扩展CB
,并在运行时在两者之间进行选择您不能使用泛型。您可以使用类似于的模式来实现这一点,但它相当复杂,需要您在单独的接口中描述C
将添加到a
或B
的类,然后使用a或B作为参数来构造和返回类定义的函数。您还必须为该函数提供两个单独的重载声明,因为基本上不可能声明扩展类以外的任何内容的类-您不能为此使用union typea | B
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;
不确定它是否解决了您的问题,或者是否值得拥有这样的复杂性,但这就是问题所在。您不能使用泛型。您可以使用类似于的模式来实现这一点,但它相当复杂,需要您在单独的接口中描述
C
将添加到a
或B
的类,然后使用a或B作为参数来构造和返回类定义的函数。您还必须为该函数提供两个单独的重载声明,因为基本上不可能声明扩展类以外的任何内容的类-您不能为此使用union typea | B
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;
不确定它是否解决了您的问题,或者是否值得拥有这样的复杂性,但事实就是如此。是否在运行时决定C是扩展A还是扩展B?是否有可能只制作两个版本的C,一个扩展A,另一个扩展B?然后你就可以根据你的运行时限制来构造正确的一个。如果你给出一个你想如何使用
C
的例子也会有所帮助——一个你想在什么时候使用C
在哪里扩展B
,另一个使用C
在哪里扩展A
的例子。基本上,你不能这样做。为什么要这样做?是否在运行时决定C是扩展A还是扩展B?是否有可能只制作两个版本的C,一个扩展A,另一个扩展B?然后你就可以根据你的运行时限制来构造正确的一个。如果你给出一个你想如何使用C
的例子也会有所帮助——一个你想在什么时候使用C
在哪里扩展B
,另一个使用C
在哪里扩展A
的例子。基本上,你不能这样做。你为什么要这么做?