Combiner le raccourci des propriétés de paramètre avec la déstructuration en TypeScript


MODIFIER

J'ai consigné un problème sur le dépôt GitHub de TypeScript et ils acceptent des PR pour l'implémenter.

En TypeScript, lorsque nous voulons créer automatiquement des propriétés dans notre classe à partir de la définition du constructeur, nous pouvons tirer parti du raccourci des propriétés de paramètre, par exemple :

class Person {
    constructor(public firstName : string, public lastName : number, public age : number) {

    }
}

Et ensuite, le Javascript transpilé sera :

var Person = (function () {
    function Person(firstName, lastName, age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
    return Person;
})();

Mais si nous voulons recevoir un objet dans notre constructeur, ce serait quelque chose comme :

interface IPerson {
    firstName : string,
    lastName : string,
    age: number
}

class Person {
    constructor(person : IPerson) {
        this.firstName = person.firstName;
        this.lastName = person.lastName;
        this.age = person.age;
    }
}

Depuis TypeScript 1.5, nous pouvons profiter de la déstructuration, par exemple :

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

Question : Comment combiner le raccourci des propriétés de paramètre et la déstructuration en TypeScript ?

J'ai essayé de définir public avant la définition de l'objet, par exemple :

class Person {
    constructor(public {firstName, lastName, age} : {firstName: string, lastName: string, age: number}) {

    }
}

Essayé de le définir avant chaque variable, par exemple :

class Person {
    constructor({public firstName, public lastName, public age} : {firstName: string, lastName: string, age: number}) {

    }
}

Mais je n'ai eu aucun succès. Des idées?

Réponse #1

Si vous avez accès à Object.assign, cela fonctionne :

class PersonData {
  firstName: string
  constructor(args : PersonData) {
    Object.assign(this, args)
  }
}

class Person extends PersonData{}

Mais notez que les nouvelles instances seront remplies par tout dans args — vous ne pouvez pas retirer seulement les clés que vous voulez utiliser.

Réponse #2

Il n’existe actuellement aucun moyen de le faire de manière abrégée, donc le plus proche que vous puissiez obtenir est de déclarer les propriétés en mode détaillé et d’assigner les variables à partir de l’assignation par déstructuration :

class Person {
    firstName: string;
    lastName: string;
    age: number;

    constructor({firstName, lastName, age} : {firstName: string, lastName: string, age: number}) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
}

Si vous faites cela... vous déciderez probablement simplement d'accepter un IPerson et d'assigner ses membres sans utiliser le déstructuration dans le constructeur du tout.