Tengo una matriz de objetos, donde cada objeto se ve así:
{ id: 'string', name: 'string' }Dada esta clase:
class User { constructor(obj: Record<string, string>) { Object.assign(this, obj); } id: string; name: string; } Quiero usar Array.map() para crear una matriz de User :
const users = userObjects.map(o => new User(o)); Lo anterior funciona, pero se siente mal: ¿hay alguna manera de pasar una referencia a la new del User y evitar la función de flecha?
No estoy realmente seguro de si la respuesta es diferente entre Javascript y Typescript (sospecho que no lo es), pero FWIW estoy codificando en Typescript.
No, no hay (aparte de una función de utilidad que puede escribir para hacer esa función de flecha por usted, pero eso es solo una abstracción de lo que ya tiene). El problema es que no hay un método new (como User::new de Java), solo existe la función User en sí misma, y si crea una instancia User o arroja un error (en entornos modernos) depende de cómo lo llame. Si lo llama a través de new (o un mecanismo similar como Reflect.construct ), crea una instancia User . Si lo llama directamente, arroja un error (en ES2015+; si está compilando a ES5, no lo hará, pero tampoco funcionará correctamente).
Lo que tienes (la función de flecha contenedora) es una forma perfectamente buena de hacerlo (y probablemente lo que yo haría).
Si necesita hacer esto en varios lugares, puede poner un método estático en User :
class User { // ... static create(...args) { return new User(...args); } } // ... const users = userObjects.map(User.create); (Tenga en cuenta que create no funcionará correctamente en las subclases de User [dependiendo de su definición de "correctamente"], siempre crea una instancia User , incluso si se llama UserSubclass.create(/*...*/) . Normalmente podría use this en lugar de User [ new this(...args) ], que aunque parece extraño, funciona siempre que la llamada establezca this correctamente [como User.create(/*...*/) o UserSubclass.create(/*...*/) lo haría], pero el map no configurará this correctamente, por lo que no funcionará a menos que bind create o recuerde pasar el segundo argumento al map [ .map(User.create, User) ], lo que nos lleva de vuelta a: una función de flecha contenedora probablemente tenga más sentido).