是否可以在没有构造函数的情况下初始化另一个对象初始化内的对象?

时间:2017-03-01 00:57:48

标签: typescript

我需要的是相当简单的,我只想初始化一个对象,它是我正在初始化的另一个对象的子对象。在C#中它看起来像这样:

var car = new Car { 
serialNumber = 25,
engine = new Engine {
    horsePower = 500
    }
}

在这个示例代码中,我在Car类型的初始化中初始化Engine类型。 在尝试使用TypeScript执行此操作时,无论我尝试什么,我都会遇到语法错误。

这是我的TypeScript代码:

var car: Car = new Car({
serialNumber: 25,
    engine: new Engine({ 
        horsePower: 500
    })
});

这段代码不起作用,这里代码中使用的所有类显然都是导入的。

TypeScript中是否支持这样的基本功能?

编辑: 这些类中没有构造函数。这是他们看起来的样子:

export class Car { 
    serialNumber: number;
    engine: Engine;
}

2 个答案:

答案 0 :(得分:7)

你当然可以这样做,你只需要传递正确的构造函数参数。

您编写的代码使用键传递单个构造函数参数对象。所以你的课程应该是这样的:

class Car {
    constructor(args: { serialNumber: number; engine: Engine; }) { }
}

class Engine {
    constructor(args: { horsePower: number; }) { }
}

但是,如果您的类使用多个命名构造函数参数,请执行以下操作:

class Car {
    constructor(serialNumber: number, engine: Engine) { }
}

class Engine {
    constructor(horsePower: number) { }
}

然后你只需要正确传递构造函数参数:

const car: Car = new Car(25, new Engine(500));

修改

  

这需要我创建一个令人讨厌的构造函数

我有点困惑......你的原始代码使用了类,所以除非你使用赋值添加每个属性,否则你应该已经有了构造函数。 请发布完整的示例。

如果你只是想创建一个嵌套的对象文字结构,你只需要一个接口,然后使用普通的JS对象文字表示法创建对象:

interface Car {
  serialNumber: number;
  engine: Engine;
}

interface Engine {
  horsePower: number;
}

const car: Car = {
  serialNumber: 25,
  engine: { 
    horsePower: 500
  }
};

如果你试图将一个对象文字分配给一个类类型,那么你做错了。 :)

编辑2

所以,你有一个具有属性而没有构造函数的类。这意味着您无法使用嵌套或一次一个的属性对其进行实例化。您可以编写一个通用的辅助函数来实例化一个类并分配属性:

function create<T>(constructor: new() => T, props: Partial<T>): T {
    let instance = new constructor();
    for (let key in props) {
        instance[key] = props[key];
    }
    return instance;
}

然后创建一个这样的嵌套类对象:

const car = create(Car, {
    serialNumber: 123,
    engine: create(Engine, {
        horsePower: 456
    })
});

但是如果你的类真的只有属性,我认为你最好只使用接口和对象文字(如我之前的例子)。

答案 1 :(得分:0)

你的回答绝对可以。但是你的语法有一个问题。

var car = new Car(
       serialNumber: 25,
      engine: new Engine{ 
      horsePower: 500
     }
 ); 

并且Car类应该是这样的:

public class Car(int serialNumber, Engine engine) {

 .....
}