не получается задать свойство элемента html Angular

Я изучаю Angular по учебному проекту, проект вроде и 2020, но ни чего не работает. У меня стоит 11 версия, в учебнике используется 9. В учебнике определяется переменная, которая меняет свойство html элемента, при создании задаю начальное значение:

menuMode = 'push';

а вот тут передаю ее в html

<ng-sidebar
    [mode]="menuMode"
>

Компилятор выдает ошибку:

error TS2322: Type 'string' is not assignable to type '"over" | "push" | "slide"'.

Если переменную объявить так:

menuMode: 'over' | 'push' | 'slide';

то компилятор пропускает, но это как-то не правильно, а если завтра появится еще одно свойство


Ответы (1 шт):

Автор решения: Sergey Glazirin

Первый вариант не true-way - обозначить как any

menuMode = 'push' as any;

Использование any очень плохая практика, не рекомендуется к использованию.

Второй вариант - вывести отдельный тип:

type MenuMode = 'over' | 'push' | 'slide';
menuMode: MenuMode = 'push'; // соответствует записи menuMode: 'over' | 'push' | 'slide';

При использовании type MenuMode, если добавится еще одно значение, то нужно будет его добавить только в объявление типа type MenuMode = 'over' | 'push' | ...;

Также нужно учитывать, что если изначальный тип не Ваш, а например из библиотеки и вы не можете его получить напрямую через import. То Ваш type MenuMode должен быть таким же как нужный тип данных или меньше. То есть:

Начальный тип 'over' | 'push' | 'slide';
type MenuMode = 'over' | 'push' | 'slide'; // будет работать
type MenuMode2 = 'over' | 'push'; // будет работать
type MenuMode3 = 'over' | 'push' | 'slide' | 'leave' ; // НЕ будет работать

Третий вариант - вывести отдельный тип и объявить переменную как тип:

type MenuMode = 'over' | 'push' | 'slide';
menuMode = 'over' as MenuMode;

Конструкция as MenuMode не очень желательна при использовании в коде, может являться причиной багов в runtime.

→ Ссылка