typescript - Typeguard för egenskap
Låt oss säga att vi har en klass som följande:
class RawResult {
private raw: string | undefined;
get exists(): boolean {
return this.raw !== undefined;
}
decode(): Result | undefined {
if (this.raw === undefined) {
return undefined;
}
return someExpensiveDecoding(this.raw);
}
}
Finns det ett sätt att tala om för TS-kompilatorn att result.exists innebär att result.decode() inte kommer att vara undefined.
Detta är baserat på Firestore DocumentSnapshot's API, där du har exists-egenskapen och data-metoden. För att dock säkerställa att data() inte är undefined behöver vi göra något som:
const data = result.data()
if (data) {
// do something with data
}
Svar #1
Inte med en egenskap, men om du kan omvandla den gettern till en vanlig metod, kan det göras så här:
type Result = {}
interface RawResultExists extends RawResult {
decode(): Result
}
class RawResult {
private raw: string | undefined;
exists(): this is RawResultExists {
return this.raw !== undefined;
}
decode() {
if (this.raw === undefined) {
return undefined;
}
return this.raw as Result
}
}
const rawResult = new RawResult();
if (rawResult.exists()) {
const data = rawResult.decode()
}
Svar #2
Nej, men du kan tala om för kompilatorn att du vet vad du gör genom att använda !-operatorn:
if (rawResult.exists()) {
const result = rawResult.decode()! // always a Result
}
