2 votes

Type de retour Typescript de la méthode factory dans la classe de base

Venant d'un milieu Python, j'ai rencontré quelques problèmes en essayant de rendre Typescript heureux avec le modèle d'héritage suivant.

Étant donné la classe de base suivante :

// model.ts
export class Model {

    serialize() {}
    static deserialize(dbRow) {}

    static async filter(options) {
        const dbRows = await getData(options);

        return dbRows.map(row => this.deserialize(row));
    }
}

et la classe suivante qui l'étend :

// user.ts
export class User extends Model {
    serialize() {......}

    static deserialize(dbRow) {......return new User(......)}

    someOtherMethod() {.....}
}

Comment pourrais-je définir Model.filter de sorte que const users = await User.filter({.....}) déduira automatiquement le type d'utilisateurs comme User[] ? Actuellement, le type déduit est Model[].

Je sais que je peux faire const users = <User[]> await User.filter({....}) mais je me demande s'il y a un moyen de suggérer le type de retour de Model.filter comme constructeur de classe afin que les instances des classes enfants soient déduites correctement.

0voto

krlm Points 392

Vous pouvez faire Model générique :

// model.ts
export class Model<T> {
    ...
    static async filter(options): Array<T> {
        const dbRows = await getData(options);

        return dbRows.map(row => this.deserialize(row));
    }
}

et ensuite :

// user.ts
export class User extends Model<User> {
   ... 
}

Vous pouvez en savoir plus sur les génériques de Typescript aquí .

0voto

Aleksey L. Points 10476

Vous pouvez utiliser la solution de contournement suivante (mentionnée à plusieurs reprises dans le document ce fil ):

type ModelContructor<T> = new () => T;

class Model {
    // ...
    static async filter<T extends Model>(this: ModelContructor<T> & typeof Model, options): Promise<T[]> {
        const dbRows = await getData(options);

        return dbRows.map(row => this.deserialize(row));
    }
}

Ici, nous utilisons des faux this qui applique le paramètre T à résoudre comme User quand User.filter appelé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X