打字稿中的实例初始化数组:"new MyClass"强制性的吗?



我声明了一个类(这只是一个简单的例子。我不使用类型别名,因为构造函数更复杂,类中有函数,...所以我需要一个类(

class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name= name;
this.age= age;
}
}

要初始化实例数组,我使用以下代码:

persons: Array<Person> = [
new Person("Joe",30),
new Person("Jack",40)
]

我想知道是否有办法避免重复多次new Person.谢谢你的回答。

如果这很常见,您可以创建一个帮助程序函数,该函数将类和构造函数的参数用于:

class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}

function newMany<T, P extends any[]>(cls: new (...p: P) => T, ...p: Array<P>): Array<T> {
return p.map(a => new cls(...a))
}
var persons: Array<Person> = newMany(Person,
["Joe", 30],
["Jack", 40]
);

游乐场链接

我会考虑使用接口,但如果你的类只有数据字段,这是通常在打字稿中完成的事情的方式:


interface Person {
name: string;
age: number;
}
var persons: Array<Person> = [
{ name: "Joe", age: 30 },
{ name: "Jack", age: 40 },
];

游乐场链接

目前还不完全清楚您要实现的目标,但是如果您要对值(Joe,Jack等(进行硬编码,则可以将它们存储在数组中并使用Array.map()将其映射到Person实例中,如下所示:

const personList = [
{name: 'Joe', age: 30},
{name: 'Jack', age: 40}
]
persons: Array<Person> = personList.map((person) => new Person(person.name, person.age))

希望这有帮助


您还可以通过在构造函数中添加访问修饰符来减少类定义:

class Person {
constructor(public name: string, public age: number) {}
//                  ^^^ this.name       ^^^ this.age
}

最新更新