私のTSコードはstrictNullChecks
とnoImplicitAny
を使用してコンパイルされており、対処する選択肢がたくさんあります。私は、変数(および他の関連する変数)を定義する必要があるかどうかを示すブールチェッカー関数を使用したいと思います。簡単な例:ブール値フラグに基づいて複数の関連変数をnull以外で未定義でないと宣言する
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}`;
}
}
}
は、どのように私は、コンパイラがmiddleName
とmiddleNameSyllables
両方がtrue
を返すthis.hasMiddleNameCheck()
の結果として、定義されるべきであることを推測するために得ることができますか?現在は、middleName as string
やmiddleName!
などの型アサーションを使用して問題を回避する必要がありますが、変数をオプションにするリファクタでは、定義されていない可能性のある変数をすべて1回だけ使用するため、これは望ましくありません。
「ヌル」値はどうですか?フィールド自体が値を持っているかどうかチェックできるかどうか、なぜブール値フラグを使用したいのですか?コンパイラには限界があります。それは魔法ではありません。 –
なぜフラグを捨てて、 'if(this.middleName!= null && this.middleNameSyllables!= null)'を明示的にチェックして、次のステートメントの内容と明確に一致するのはなぜですか? 'x!= null'は' x === null'と 'x === undefined'の両方に当てはまります。 – Duncan