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?
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 Name
requiert 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;
}
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'
}
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.