Тип защиты, когда свойство класса является символом?

#typescript

#typescript

Вопрос:

Я хотел использовать символ для свойства, но я понимаю, что из-за того, что я использую this[SYM] синтаксис, я не могу заставить защиту работать должным образом. Мне было интересно, есть ли лучший синтаксис, чтобы заставить это работать.

 const SYM = Symbol('SYM');
class Example {
  [SYM]?: string;
  get prop(): string {
    if (this[SYM]) return this[SYM];
    return 'default';
  }
}
  

Однако это работает:

 const SYM = Symbol('SYM');
class Example {
  [SYM]?: string;
  get prop(): string {
    const v = this[SYM];
    if (v) return v;
    return 'default';
  }
}
  

Ответ №1:

Сужение типа доступного свойства не сужает тип родительского объекта. Таким образом, проверка this[SYM] ничего не говорит TS, потому что ее нет в отдельной переменной. Вот почему извлечение значения в v works — это отдельная переменная, поэтому ее можно сузить.

Более лаконичная версия будет:

 const SYM = Symbol('SYM');
class Example {
  [SYM]?: string;
  get prop() {
    return this[SYM] ?? 'default';
  }
}
  

Нет необходимости явно аннотировать возвращаемое значение prop после того, как ваши типизации верны.