我需要的是相当简单的,我只想初始化一个对象,它是我正在初始化的另一个对象的子对象。在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;
}
答案 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) {
.....
}