设置扩展类基类值?

时间:2018-03-14 10:32:54

标签: javascript typescript

我对将值从基类的实例映射到扩展类有一些理解问题。有没有办法在不指定构造函数中的所有单个属性的情况下执行此操作?如果其他开发人员将更多可选参数添加到基类,我不想这样做。 (还有大约20个这样的类,每个类都有30多个属性)

鉴于以下代码,在没有'破坏'打字稿的情况下设置扩展类的值的最佳方法是什么。

export class BaseClass {
    a: string;
    b: string;
    c: string;
}

export class ExtendClass extends BaseClass {
    d: string;
    e: string;
}


const exampleBase = {
    a: 'help',
    b: 'me',
    c: 'please',
};

let exampleExtend: ExtendClass = exampleBase; // Is there a way do this ??
exampleExtend.d = 'hello';
exampleExtend.e = 'world';

let exampleExtend2: any = exampleBase; // Breaking typing
exampleExtend2.d = 'hello';
exampleExtend2.e = 'world';

我想知道是否有一种方法可以通过构造函数实现这一点,但是无法看到将类分配给传入的参数的方法......可能因为这是精神上的。

export class BaseClass {
    constructor(values?: BaseClass) {
        if (values) {
            this = values; // Is there a way to do this? I think not and for good reason.
        }
    }
    a: string;
    b: string;
    c: string;
}

export class ExtendClass extends BaseClass {

    constructor(values: BaseClass) {
        super(values);
    }
    d: string;
    e: string;
}

2 个答案:

答案 0 :(得分:2)

您正在寻找的是一个干净的构造函数和Object.assign

class Bar {
    a: string;
    b: string;
    c: string;

    constructor(obj) {
        Object.assign(this, obj);
    }
}

let bar = new Bar({a: 'foo', b: 'bar', c: 'baz'});

console.log(bar.a);

答案 1 :(得分:1)

@baao解决方案可以工作,但是有一个问题是你可以通过{a: 'foo', b: 'bar', c: 'baz', oops: 'oops'}而你现在已经在你的对象上找到了一个名为oops的属性,基本上你已经丢失了打字稿的类型检查。

解决这个问题的一种方法是使用接口,然后构造函数可以使用它。

例如

interface BarImp {
    a: string;
    b: string;
    c: string;    
}

class Bar implements BarImp {
    a: string;
    b: string;
    c: string;
    constructor(obj: BarImp) {
        Object.assign(this, obj);
    }
}

let bar = new Bar({a: 'foo', b: 'bar', c: 'baz'});

//but this will still fail.
//let bar = new Bar({a: 'foo', b: 'bar', c: 'baz', oops: 'oops'});  

console.log(bar.a);