Наиболее распространенные случаи использования для Enum являются:
- Клавиши и связанные сопутствующие строковые значения
- Клавиши и строковые значения, которые соответствуют ключам
Теперь не читай это не так. Я просто не хочу воспроизвести все, что написано в справочнике TypeyctS ( https://www.typescriptlang.org/docs/handbook/enums.html )
Первый адекватно обрабатывается в Tymdercript. Просто используя:
enum MyEnum {
first,
second,
third
}
Но второй случай выглядит больше похоже на это:
enum MyStringEnum {
first = 'first',
second = 'second',
third = 'third'
}
По мере увеличения количества ценностей он начинает управлять. И я увижу много котельной здесь. Также есть сфера для ошибок. Например, можно попасть в эту ситуацию:
enum MyStringEnum {
first = 'fifth',
second = 'second',
third = 'third'
}
В справочнике посмотрите на всю сложность, необходимую, чтобы сделать обратный поиск от врач.
Вот мое предложение, чтобы построить простую структуру, которую вы можете реализовать быстро.
Давайте начнем с определения значений, которые мы хотим быть «ключами» в Enum:
const value_enum_values = [«первый», «второй», «третий»] как const;
Обратите внимание на Как const в конце заявления. Это то, что будет иметь значение.
Давайте определим тип, который мы можем использовать в коде, чтобы убедиться, что мы не используем никаких недопустимых значений: Тип Valid_enum_Values [номер];
Если вы введете это в VSCode, и наведите курсор мыши на Миенум , вы должны увидеть, что это эквивалент определения: Тип |. «Второй» | 'третий';
[номер] Сообщает TeampScript, чтобы получить все «подписки на основе номеров» массива.
Дополнительное преимущество, если вы внесите изменения в Valid_enum_values Массив, Миенум меняется с этим.
Итак, если вы должны были ввести следующий код в редакторе:
console.log("Valid values of the enum are:", VALID_ENUM_VALUES);
const valueToCheck = 'first';
console.log(`Check if '${valueToCheck}' is part of the enum`, VALID_ENUM_VALUES.includes(valueToCheck))
// Error here, because "hello" is not a value in the VALID_ENUM_VALUES array.
const typedVar: MyEnum = 'hello';
Обратный поиск не нужен. Но вы хотите, чтобы способ проверить, действует ли заданное значение в контексте этого enum. За это, давайте напишите Asserter тип:
function isValid(param: unknown): asserts param is MyEnum {
assert( param && typeof param === 'string' && VALID_ENUM_VALUES.includes(param as MyEnum));
}
Теперь в этом контексте:
const myStr = 'first';
if ( isValid(myStr)) {
// here, if 'myStr' is implicitly of type 'MyEnum'
console.log(`${myStr} is a valid Enum value`);
}
Другое использование этой конструкции, находится в определении объектов с ключами. Посмотри:
type MyRecordType = Record; // the 'myValue' below will error, because '{}' is not a valid value const myValue: MyRecordType = {};
Здесь определение типа является эквивалентным:
type MyRecordType = {
first: unknown;
second: unknown;
third: unknown;
}
Вы можете изменить «неизвестно» на любой соответствующий тип. Итак, это дает вам быстрый способ определения объектов с заданной структурой и определенными типами. Очевидно, что более сложные случаи лучше обрабатываются вручную.
Вот еще один вариант того же:
type MyPartialRecordType = Partial; // no error here const myPartialValue: MyPartialRecordType = {};
Это эквивалент:
type MyPartialRecordType = {
first?: unknown;
second?: unknown;
third?: unknown;
}
Если вы хотите использовать их в комбинации, попробуйте это:
const MUST_HAVE_PARAMS = ['one', 'two'] as const; type MandatoryParams = typeof MUST_HAVE_PARAMS[number]; const OPTIONAL_PARAMS = ['three', 'four'] as const; type OptionalParams = typeof OPTIONAL_PARAMS[number]; type MixedRecord = Record& Partial >;
Это эквивалент:
type MixedRecord = {
one: unknown;
two: unknown;
} & {
three?: unknown;
four?: unknown;
}
Или, чтобы упростить его дальше:
type MixedRecord = {
one: unknown;
two: unknown;
three?: unknown;
four?: unknown;
}
Итак, теперь вы можете создать тип профсоюза, тип записи, а также иметь массив для проверки значений против.
Еще один интересный пример, с участием сопоставленных типов:
const KNOWN_PARAMS_TYPES = ['id', 'name'] as const; type KnownParams = typeof KNOWN_PARAMS_TYPES[number]; const UNKNOWN_PARAMS_TYPES = ['contentsOfWallet'] as const; type UnknownParams = typeof UNKNOWN_PARAMS_TYPES[number]; type AllParams = KnownParams | UnknownParams; type ValueType= T extends KnownParams ? string : unknown; type ParamType = { [Property in AllParams]: ValueType ; }
Это эквивалент:
type ParamType = {
id: string;
name: string;
contentsOfWallet: unknown;
}
Это может выглядеть как много магии для чего-то, что можно определить в меньшем количестве места, но посмотрите на то, что доступно:
- Массивы действительных имен полей, которые могут использоваться для проверки ввода, например, когда вы имеете дело с строками HTTP-запроса и хотите проверить, является ли имя параметра
- Типы строк-профсоюза для использования в пределах приложений, для тех места, где вы иначе использовали
Ключ парамтипакак тип - Структура, которая будет обновляться, как вы добавляете больше параметров в известные/неизвестные части.
Таким образом, для случаев, когда вы хотите, чтобы массив значений использовать в различных местах в приложении, и все же хочется вносить тип безопасных структур данных, такого рода организация будет иметь большое значение для того, чтобы сделать ваш код расширяемой, используя мощность Tymdercript.
Этот блог изначально был опубликован Navneet Karnani ( Navneet@mandraketech.in ) в своем блоге по адресу: https://blog.mandraketech.in/typescript-string-enums.
Оригинал: “https://dev.to/mandraketech/typescript-string-enums-the-easy-way-1ke4”