#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
после того, как ваши типизации верны.