Mon code TS est compilé en utilisant strictNullChecks
et noImplicitAny
, et j'ai beaucoup d'options à traiter. Je souhaite utiliser une fonction de vérificateur booléen pour indiquer si la variable (et d'autres variables connexes) doit être définie ou non. Exemple simplifié:Affirmer plusieurs variables connexes comme non nul et non indéfini basé sur un indicateur booléen
class Person {
private firstName: string;
private firstNameSyllables: number;
private middleName?: string;
private middleNameSyllables?: number;
private hasMiddleName: boolean;
constructor(firstName: string, middleName?: string){
this.firstName = firstName;
this.firstNameSyllables = calculateSyllables(firstName);
if(typeof middleName !== "undefined"){
this.middleName = middleName;
this.middleNameSyllables = calculateSyllables(middleName);
this.hasMiddleName = true;
} else {
this.hasMiddleName = false;
}
}
// Stub function
calculateSyllables(name: string): number { return name.length/3; }
hasMiddleNameCheck(): boolean { return this.hasMiddleName; }
getStartOfNameWithSyllables(): string {
if(this.hasMiddleNameCheck()){
// ERROR: middleName and middleNameSyllables may be undefined
return `${this.firstName}: ${this.firstNameSyllables},` +
`${this.middleName}: ${this.middleNameSyllables}`;
} else {
return `${this.firstName}: ${this.firstNameSyllables}`;
}
}
}
Comment puis-je obtenir le compilateur de déduire que les deux middleName
et middleNameSyllables
doivent être définis, à la suite de this.hasMiddleNameCheck()
retour true
? Actuellement je dois contourner le problème en utilisant des assertions de type telles que middleName as string
ou middleName!
, mais cela n'est pas souhaitable lors de refacteurs qui rendent les variables facultatives, car cela implique de suivre chaque utilisation d'une variable éventuellement indéfinie.
Qu'en est-il de la valeur 'null'? Pourquoi voulez-vous utiliser un indicateur booléen si vous pouvez vérifier le champ lui-même pour avoir une valeur ou non?Il y a des limites au compilateur - ce n'est pas magique. –
Pourquoi ne pas simplement abandonner le drapeau et vérifier explicitement 'if (this.middleName! = Null && thisMiddleNameSyllables! = Null)' qui correspond alors clairement au contenu des énoncés suivants? Le 'x! = Null' est vrai pour' x === null' et 'x === undefined'. – Duncan