Typeguard для собственности - PullRequest
2 голосов
/ 29 апреля 2020

Допустим, у нас есть класс, подобный следующему:

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); 
  }
}

Есть ли способ сообщить компилятору TS, что result.exists подразумевает, что result.decode() не будет undefined.

Это основано на API Firestore DocumentSnapshot , в котором у вас есть свойство exists и метод data. Однако, чтобы убедиться, что data() не undefined, нам нужно сделать что-то вроде:

const data = result.data()
if (data) {
   // do something with data
}

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Не со свойством, но если вы можете преобразовать этот метод получения в обычный метод, это можно сделать так:

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()
}

0 голосов
/ 29 апреля 2020

Нет, но вы можете сказать компилятору, что знаете, что делаете, используя оператор ! :

if (rawResult.exists()) {
    const result = rawResult.decode()!   // always a Result
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...