Как указано в документации, 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?
Название вашего вопроса на самом деле не вопрос. Также непонятно, что вы хотите решить: проблемы с перечислениями или проблему «это работает на моей машине».
@marzelin, желательно и то, и другое. В любом случае, я думаю, что это предложение «Есть идеи, что может вызвать эту проблему и как это можно предотвратить?» подтверждая это. Название действительно было неправильным
@ Katana314 для перечислений строк это имеет смысл. Поскольку перечисления на основе чисел немного отличаются, поскольку их можно удобно использовать при индексировании массивов, для основанных на строках я буквально не вижу разницы. Не могли бы вы обновить свой комментарий, чтобы ответить, я бы хотел проголосовать





Ваш синтаксис неверен. Вы должны использовать ключевое слово enum перед объявлением перечисления, например
enum stringBasedEnum = {
FOO = 'Foo'
}
Ой, извините, я написал этот вопрос по телефону прямо из головы, в любом случае спасибо за подсказку, я исправил исходный вопрос. В любом случае, это не ответ, исходный код, конечно, имеет префикс enum.
Убедитесь, что вы все компилируете с одной и той же версией 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?
Версия рабочей области будет использоваться при запуске tsc из сценария npm с npm run.
Тогда как бы вы объяснили, что проект компилируется на моей машине, в то время как 2 других сотрудника имеют ошибку компиляции? Должна использоваться та же версия TSC (действительно, ниже, чем 2.4.x), но она также не должна работать на моей стороне
Вы создаете файл package-lock.json? Убедитесь, что это так, и передайте это в систему управления версиями. Это гарантирует, что все установят одну и ту же версию пакетов вашего проекта при запуске npm install.
package-lock.json на месте
Убедитесь, что версия Typescript в вашем package-lock.json - 2.4+.
На самом деле он ниже, чем 2.4. + (2.2.x), и это ответ, почему мои товарищи по команде не смогли его скомпилировать. Остается вопрос, почему я смог запустить его без проблем?
Не прямой ответ, но я добился большего успеха с использованием ключевого слова
type, чем с перечислениями, и это не зависит от владения одним и тем же исходным файлом (вы не можете записывать перечисления в файл d.ts). Примером может быть:type thisOrThat = 'this' | 'that'; var myThis:thisOrThat = 'notthis'; <-- compilation error. Это своего рода тот же подход, который используется в нативных функциях, таких какdocument.createElement(elementTypeAsString).