如何在Typescript中模仿Python中的kwargs

如何在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

因此,我正在用typescript构建一个小库。有一个基类,多个类将从中继承。
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 {
  // ...
}