Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 设置扩展类基类值?_Javascript_Typescript - Fatal编程技术网

Javascript 设置扩展类基类值?

Javascript 设置扩展类基类值?,javascript,typescript,Javascript,Typescript,我在将值从基类实例映射到扩展类时遇到了一些理解问题。有没有一种方法可以在不指定构造函数中所有单个属性的情况下执行此操作?如果其他开发人员向基类添加了更多可选参数,我不想这样做。(这些类别中大约有20个,每个类别有30多个属性) 给定以下代码,在不“破坏”typescript的情况下设置扩展类的值的最佳方法是什么 export class BaseClass { a: string; b: string; c: string; } export class ExtendC

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

给定以下代码,在不“破坏”typescript的情况下设置扩展类的值的最佳方法是什么

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;
}

你要找的是一个干净的构造函数和
对象。分配

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);

你要找的是一个干净的构造函数和
对象。分配

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);

@baao解决方案将起作用,。。但是有一个问题是你可以通过
{a:'foo',b:'bar',c:'baz',oops:'oops'}
你现在在你的对象上有了一个叫做oops的属性,基本上你已经失去了typescript的类型检查

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';
解决这个问题的一种方法是使用一个接口,然后您的构造函数可以使用这个接口

例如


@baao解决方案将起作用,。。但是有一个问题是你可以通过
{a:'foo',b:'bar',c:'baz',oops:'oops'}
你现在在你的对象上有了一个叫做oops的属性,基本上你已经失去了typescript的类型检查

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';
解决这个问题的一种方法是使用一个接口,然后您的构造函数可以使用这个接口

例如


//有没有办法做到这一点???
->
让exampleExtend:ExtendClass=exampleBase
//有没有办法做到这一点???
->
让exampleExtend:ExtendClass=exampleBase这看起来是一个很好的解决方案!幸运的是,对于我的用例,@baao解决方案已经足够好了,因为在实例化扩展类之前,我有其他代码预先剥离了额外的属性。为什么我不能只使用我的基类作为类型而不是单独的接口?构造函数(obj:BaseClass){Object.assign(this,obj);}@Ravendarksky
为什么我不能只使用我的基类作为类型而不是单独的接口?
您可以这样做,但一旦您开始向
Bar
添加方法,所有这些方法都需要成为您发送的对象的一部分。IOW:如果您将名为
test
的方法添加到
Bar
,您现在需要发送
{a:'foo',b:'Bar',c:'baz',test:function(){}
等。最好像你在这里做的那样使用界面-这与我的相反,更适合于类型脚本和类型安全。这看起来是一个很好的解决方案!幸运的是,对于我的用例,@baao解决方案已经足够好了,因为在实例化扩展类之前,我有其他代码预先剥离了额外的属性。为什么我不能只使用我的基类作为类型而不是单独的接口?构造函数(obj:BaseClass){Object.assign(this,obj);}@Ravendarksky
为什么我不能只使用我的基类作为类型而不是单独的接口?
您可以这样做,但一旦您开始向
Bar
添加方法,所有这些方法都需要成为您发送的对象的一部分。IOW:如果您将名为
test
的方法添加到
Bar
,您现在需要发送
{a:'foo',b:'Bar',c:'baz',test:function(){}
等。最好像您在这里使用的那样使用界面-与我的相反,它更适合类型脚本和类型安全。