web-dev-qa-db-fra.com

Dans TypeScript, comment réparer Ne peut pas définir la propriété «première» de non défini

J'essaie de définir une sous-propriété first définie dans l'interface Name mais quand je le fais, j'obtiens toujours une erreur par exemple:

interface Name{
    first: string,
    last:string,
}

class Person{

    private name:Name

    public setName(firstName, lastName){
        this.name.first = firstName;
        this.name.last = lastName;
    }

}


var person1  = new Person();
person1.setName('Tracy','Herrera');

Lors de son exécution, j'obtiens l'erreur: Cannot set property 'first' of undefined

Quelqu'un a une idée pour résoudre ce problème?

15
Mustafa Dwekat

Les propriétés de classe ne sont pas automatiquement initialisées lors de l'instanciation. Vous devez les initialiser manuellement avec les objets correspondants - dans ce cas, avec un objet contenant les propriétés définies par son interface:

class Person {
    private name: Name;

    public setName(firstName, lastName) {
        this.name = {
            first: firstName,
            last: lastName
        };
    }
}

Une autre approche - par exemple, dans le cas où plusieurs méthodes définissent des propriétés sur le même objet - consiste à initialiser d'abord la propriété en un objet vide, de préférence dans le constructeur:

class Person {
    private name: Name;

    constructor() {
        this.name = {};
    }

    public setName(firstName, lastName) {
        this.name.first = firstName;
        this.name.last = lastName;
    }

    public setFirstName(firstName) {
        this.name.first = firstName;
    }
}

Cependant, avec la configuration actuelle, cela produira une erreur de compilation lors de l'attribution de {} à this.name, car l'interface Namerequiert la présence d'une propriété first et d'une propriété last sur l'objet. Pour surmonter cette erreur, on pourrait avoir recours à la définition de propriétés facultatif sur une interface:

interface Name {
    first?: string;
    last?: string;
}
29
John Weisz

Vous devez définir nom sur un objet de type Nom (c'est-à-dire une forme correspondant à cette interface).

Par exemple:

this.name = {
    first: 'John',
    last: 'Doe'
}
5
Ted Nyberg

si vous voulez avoir la liberté, faire des changements, séparément vous pouvez faire quelque chose comme, en utilisant ?,

interface Name{
    first?: string;
    last? : string;
}

class Person{

    private name:Name

        public setName(firstName: string, lastName: string){
            this.name = { first: firstName, last: lastName };
        }

        public setNameSample(firstName: string){
            this.name = { first: firstName };
        }

        public setNameSample1(lastName: string){
            this.name = { last: lastName };
        }
}

Dans le cas ci-dessus, si vous n'utilisez pas ? vous obtiendrez quelque chose comme dans setNameSample par exemple si vous avez besoin de définir uniquement first:

Tapez '{first: any; } 'n'est pas attribuable au type' Nom '. La propriété 'last' est manquante dans

Remarque: Je pense que la réponse précédente est la voie à suivre, ce n'est qu'un ajout.

3
Angel Angel