如何在Typescript中模仿Python中的kwargs
因此,我正在用typescript构建一个小库。有一个基类,多个类将从中继承。如何在Typescript中模仿Python中的kwargs,python,typescript,oop,Python,Typescript,Oop,因此,我正在用typescript构建一个小库。有一个基类,多个类将从中继承。base类有许多属性可以作为参数传递到构造函数中,这些属性可以具有defaut值。问题是,是否必须在每个子类的构造函数中提供这些base类属性 例如: class BaseClass { constructor(a: number, b: number, c: number, d: number) { this.a = a; this.b = b; this.c
base
类有许多属性可以作为参数传递到构造函数中,这些属性可以具有defaut值。问题是,是否必须在每个子类的构造函数中提供这些base
类属性
例如:
class BaseClass {
constructor(a: number, b: number, c: number, d: number) {
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
private a: number;
private b: number;
private c: number;
private d: number;
}
class SubClass extends BaseClass {
constructor(a: number, b: number, c: number, d: number, e: number, f: number) {
super(a, b, c, d);
this.e = e;
this.f = f;
}
private e: number;
private f: number;
}
是否有任何方法可以减少冗长,比如python在
\uuuu init\uuuu
中调用super时可以使用kwargs
?是的,您可以将工作方式类似的对象传递给kwargs。我在aws CDK中看到过类似的编码风格,现代ecmascript标准(以及连续的typescript)似乎很好地使用了这种方法,因为对象分解一直以来都是第一流的。
例如:
接口BaseClassKwargs{
a:数字;
b:数字;
c:数字;
d:数字;
}
接口子类KWARGS扩展了BaseClassKwargs{
e:数字;
f:数量;
}
类基类{
构造函数(kwargs:BaseClassKwargs){
this.a=kwargs['a'];
this.b=kwargs['b'];
this.c=kwargs['c'];
this.d=kwargs['d'];
}
私人a:号码;
私人乙:号码;
私人c:数字;
私人d:数字;
}
类子类扩展了基类{
构造函数(kwargs:子类kwargs){
超级(kwargs);
this.e=kwargs['e'];
this.f=kwargs['f'];
}
私人e:数字;
私人f:数字;
}
利用重组甚至可以写成:
类基类{
构造函数({a,b,c,d}:BaseClassKwargs){
这个a=a;
这个.b=b;
这个.c=c;
这个。d=d;
}
私人a:号码;
私人乙:号码;
私人c:数字;
私人d:数字;
}
类子类扩展了基类{
构造函数({e,f,…kwargs}:子类kwargs){
超级(kwargs);
这个。e=e;
这个。f=f;
}
私人e:数字;
私人f:数字;
}
在aws cdk中,它们不被称为kwargs,它们被称为道具,但无论名称如何,它们的思维方式都是相似的
请注意,对于具有默认值的情况,即使是同时具有完整对象及其具有默认值的属性的极端情况,也可以包括:
constructor({ a = 1, b = 0, c = -1, d = -2 } = {}): void {
// ...
}
是的,您可以传递与kwargs工作方式类似的对象。我在aws CDK中看到过类似的编码风格,现代ecmascript标准(以及连续的typescript)似乎很好地使用了这种方法,因为对象分解一直以来都是第一流的。 例如:
接口BaseClassKwargs{
a:数字;
b:数字;
c:数字;
d:数字;
}
接口子类KWARGS扩展了BaseClassKwargs{
e:数字;
f:数量;
}
类基类{
构造函数(kwargs:BaseClassKwargs){
this.a=kwargs['a'];
this.b=kwargs['b'];
this.c=kwargs['c'];
this.d=kwargs['d'];
}
私人a:号码;
私人乙:号码;
私人c:数字;
私人d:数字;
}
类子类扩展了基类{
构造函数(kwargs:子类kwargs){
超级(kwargs);
this.e=kwargs['e'];
this.f=kwargs['f'];
}
私人e:数字;
私人f:数字;
}
利用重组甚至可以写成:
类基类{
构造函数({a,b,c,d}:BaseClassKwargs){
这个a=a;
这个.b=b;
这个.c=c;
这个。d=d;
}
私人a:号码;
私人乙:号码;
私人c:数字;
私人d:数字;
}
类子类扩展了基类{
构造函数({e,f,…kwargs}:子类kwargs){
超级(kwargs);
这个。e=e;
这个。f=f;
}
私人e:数字;
私人f:数字;
}
在aws cdk中,它们不被称为kwargs,它们被称为道具,但无论名称如何,它们的思维方式都是相似的
请注意,对于具有默认值的情况,即使是同时具有完整对象及其具有默认值的属性的极端情况,也可以包括:
constructor({ a = 1, b = 0, c = -1, d = -2 } = {}): void {
// ...
}