Перечисление TypeScript из ошибки преобразования строкового типа

Как указано в документации, TS поддерживает перечисления как на числовой, так и на строковой основе:

enum numBasedEnum {
  E1 = 0,
  E2 = 1,
}

enum stringBasedEnum {
  E3 = 'Str1'
  E4 = 'Str2'
}

Недавно моя и моя команда столкнулись с проблемами из-за таких проблем, как:

Type '"Str1"' is not assignable to type 'stringBasedEnum'

и, наконец, после некоторого кастинга с явной ошибкой:

Type 'string' cannot be converted to type 'stringBasedEnum'.

Тем не менее, для одного из нас это работало отлично (компиляция запускалась и работала без проблем), в то время как другие не работали во время компиляции.

Мы все используем npm, чтобы поддерживать утилиты в одной версии (очистка кеша и повторная установка не помогли), все мы работаем на компьютерах с Windows и все мы используем VS Code в качестве редактора.

Есть идеи, что может вызвать эту проблему и как это можно предотвратить?

Я предполагаю, что это могут быть некоторые глобальные версии инструментов (например, angular CLI), но разве проект не предполагает использовать локальную версию инструментов при вызове npm start?

Не прямой ответ, но я добился большего успеха с использованием ключевого слова type, чем с перечислениями, и это не зависит от владения одним и тем же исходным файлом (вы не можете записывать перечисления в файл d.ts). Примером может быть: type thisOrThat = 'this' | 'that'; var myThis:thisOrThat = 'notthis'; <-- compilation error. Это своего рода тот же подход, который используется в нативных функциях, таких как document.createElement(elementTypeAsString).

Katana314 18.10.2018 15:00

Название вашего вопроса на самом деле не вопрос. Также непонятно, что вы хотите решить: проблемы с перечислениями или проблему «это работает на моей машине».

marzelin 18.10.2018 15:12

@marzelin, желательно и то, и другое. В любом случае, я думаю, что это предложение «Есть идеи, что может вызвать эту проблему и как это можно предотвратить?» подтверждая это. Название действительно было неправильным

Tomas 18.10.2018 17:58

@ Katana314 для перечислений строк это имеет смысл. Поскольку перечисления на основе чисел немного отличаются, поскольку их можно удобно использовать при индексировании массивов, для основанных на строках я буквально не вижу разницы. Не могли бы вы обновить свой комментарий, чтобы ответить, я бы хотел проголосовать

Tomas 18.10.2018 20:22
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
4
243
2

Ответы 2

Ваш синтаксис неверен. Вы должны использовать ключевое слово enum перед объявлением перечисления, например

enum stringBasedEnum = {
    FOO = 'Foo'
}

Ой, извините, я написал этот вопрос по телефону прямо из головы, в любом случае спасибо за подсказку, я исправил исходный вопрос. В любом случае, это не ответ, исходный код, конечно, имеет префикс enum.

Tomas 18.10.2018 20:27

Убедитесь, что вы все компилируете с одной и той же версией Typescript. Функция перечисления строк была добавлена ​​в Typescript 2.4.

Проверьте свою глобальную версию Typescript с помощью tsc -v.

Проверьте версию вашей рабочей области. Типскрипт используйте npx tsc -v.

До Typescript 2.4 вы могли объявлять перечисления со строковыми значениями с помощью хака ниже. Используйте это, если вы еще не можете выполнить обновление до Typescript 2.4+.

enum stringBasedEnum {
    E3 = <any>'Str1'
    E4 = <any>'Str2'
}

Также проверьте, какую версию Typescript использует код VS. Вы можете настроить его на использование вашей глобальной версии, установленной версии VS Code или версии, установленной в вашей рабочей области. Установка этого параметра поможет intellisense в VS Code на основе поддерживаемой вами версии Typescript.

Я ищу такой ответ. Вопрос в том, какая версия tsc используется при вызове npm run?

Tomas 18.10.2018 20:28

Версия рабочей области будет использоваться при запуске tsc из сценария npm с npm run.

Derek 18.10.2018 22:03

Тогда как бы вы объяснили, что проект компилируется на моей машине, в то время как 2 других сотрудника имеют ошибку компиляции? Должна использоваться та же версия TSC (действительно, ниже, чем 2.4.x), но она также не должна работать на моей стороне

Tomas 18.10.2018 22:08

Вы создаете файл package-lock.json? Убедитесь, что это так, и передайте это в систему управления версиями. Это гарантирует, что все установят одну и ту же версию пакетов вашего проекта при запуске npm install.

Derek 18.10.2018 22:18
package-lock.json на месте
Tomas 18.10.2018 22:37

Убедитесь, что версия Typescript в вашем package-lock.json - 2.4+.

Derek 19.10.2018 14:12

На самом деле он ниже, чем 2.4. + (2.2.x), и это ответ, почему мои товарищи по команде не смогли его скомпилировать. Остается вопрос, почему я смог запустить его без проблем?

Tomas 23.10.2018 13:07

Другие вопросы по теме