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
}