Angular не может скомпилировать модификаторы сопоставленного типа Typescript

У меня есть проект node.js, в котором я успешно использую пользовательский сопоставленный тип

export type Mutable<T> = {
    -readonly [P in keyof T]: T[P];
};

но если я добавлю тот же код в проект Angular 6, компиляция завершится ошибкой:

ОШИБКА в src/assets/scripts/utils.ts(2,5): ошибка TS1131: ожидается свойство или подпись.
src/assets/scripts/utils.ts(2,27): ошибка TS1005: ожидается ']' .
src/assets/scripts/utils.ts(2,28): ошибка TS1005: ';' ожидаемо.
src/assets/scripts/utils.ts(14,29): ошибка TS1128: ожидается объявление или инструкция.
src/assets/scripts/utils.ts(3,1): ошибка TS1128: объявление или заявление ожидается.

Почему это происходит и как я могу решить?

Заранее всем спасибо!!


person Sergio    schedule 31.07.2018    source источник


Ответы (2)


Вы используете старую версию машинописного текста (2.7 или ниже). Возможность явного удаления модификатора readonly была добавлена ​​только в версии 2.8 (см. PR и Дорожная карта).

Вы можете использовать трюк для достижения результата удаления только для чтения в предыдущих версиях машинописного текста, как описано ">здесь

type MutableHelper<T, TNames extends string> = { [P in TNames]: (T & { [name: string]: never })[P]};
type Mutable<T> = MutableHelper<T, keyof T>;
person Titian Cernicova-Dragomir    schedule 31.07.2018
comment
keyof T помечен как ошибка, говоря: Тип 'keyof T' не удовлетворяет ограничению 'string'. Введите строку | номер | символ» нельзя присвоить типу «строка». Тип «число» не может быть присвоен типу «строка». - person Sergio; 31.07.2018
comment
@Sergio Хм .. Я думаю, что ваша визуальная студия использует 3.0, а ваша сборка использует 2.7 ... вы можете переключить версию, которую использует VS, в правом нижнем углу.. В 2.9 я думаю, что keyof T - это не только string, но и string | number | symbol - person Titian Cernicova-Dragomir; 31.07.2018
comment
Я использую текущую версию vscode 2.9.2. - person Sergio; 31.07.2018
comment
@Sergio, вам нужно указать коду VS использовать 2.7, поскольку это версия, с которой вы компилируете, иначе вы получите несовместимые ошибки между сборкой и vscode. Это может быть полезно: stackoverflow.com/questions/39668731/ - person Titian Cernicova-Dragomir; 31.07.2018
comment
попытался перейти с 2.9.2 на 2.7.2 (ng 6), но получил слишком много ошибок, я думаю, что буду использовать 2 отдельные версии и не буду делиться этим фрагментом кода. Это всего лишь школьный проект... Спасибо, что уделили время, сэр! - person Sergio; 31.07.2018
comment
случайно узнал, что для того, чтобы использовать ваш код с 2.9+, вы можете сделать Extract<keyof T, string> (если вы хотите обновить свой ответ! :D) - person Sergio; 31.07.2018
comment
@Серджио, да, я знаю о Extract, но это функция 2.8+, и предполагается, что обходной путь должен быть 2.7 или ниже ... - person Titian Cernicova-Dragomir; 31.07.2018
comment
хм, даже не проверил ахаха забудь тогда - person Sergio; 31.07.2018

Последний @angular/[email protected] использует typescript@~2.7.2, а отображаемый тип является функцией @typescript@^2.8.

person lenilsondc    schedule 31.07.2018