Búsqueda de sitios web

javascript - ¿Cómo puedo expresar una función constructora con variables estáticas en Typescript?


Tengo la siguiente clase a la que me gustaría acceder en un archivo diferente:

export class Person {

    constructor() {}

    static getDatabaseId(): string {
        return '...';
    }
}

Se inyecta y no se importa realmente. Quiero dejar claro que es una función constructora y que puede crear nuevas instancias del tipo Person. Esto es lo que intenté:

let PersonConstructor: {new(): Person};

// inject Person constructor function
beforeEach(inject((_Person_) => {
    PersonConstructor = _Person_;
}));

// create a new instance but also access the static variables
const p: Person = new PersonConstructor();
PersonConstructor.getDatabaseId(); // "property does not exist"

El compilador ya no se queja de instanciar nuevas instancias de Person, pero por supuesto, ahora tampoco conoce las variables estáticas de Person ya que faltan en el tipo recién declarado.

¿Cómo se puede teclear esto correctamente?

Respuesta #1

No estoy seguro de cuál es el objetivo final de tu código. Según la documentación de TypeScript, un posible uso de la sintaxis que estás tratando de lograr es modificar el miembro static de la clase y crear nuevas instancias con nuevos miembros estáticos.

Si vas a hacer eso, el código correcto se verá así

let PersonConstructor: typeof Person = Person;

// create a new instance but also access the static variables
const p: Person = new PersonConstructor();
PersonConstructor.getDatabaseId(); // Also OK and you my change it. Original Person will not get it changed.

Respuesta #2

Puedes usar el método de firma del constructor, pero necesitarás añadir cualquier otro miembro al que necesites acceder.

import {Person} from './Person';

let PersonConstructor: {
    new(): Person
    getDatabaseId(): string
} = Person;

// create a new instance but also access the static variables
const p: Person = new PersonConstructor();
PersonConstructor.getDatabaseId(); // "property does not exist"

Alternativamente, podrías simplemente usar typeof Person si quieres usar exactamente el mismo tipo que Person (firma del constructor y todos los estáticos):

import {Person} from './Person';

let PersonConstructor: typeof Person = Person;

// create a new instance but also access the static variables
const p: Person = new PersonConstructor();
PersonConstructor.getDatabaseId(); // "property does not exist"