Это великолепно, спасибо. Двойной палец вверх для дополнительного нюанса образования. Это заставляет меня думать, что для машинописного текста может быть полезен какой-то препроцессор, который может (по крайней мере, в этом случае) сделать код более простым. Но это не было бы самой машинописью. Благодарю. Сейчас я думаю, что я просто заставлю потребителя понять и использовать конструкцию «keyof typeof». И я рад, что на этой странице есть ссылка, почему!
отрим следующее перечисление машинописи:
enum MyEnum { A, B, C };
Если мне нужен другой тип, представляющий собой объединенные строки ключей этого перечисления, я могу сделать следующее:
type MyEnumKeysAsStrings = keyof typeof MyEnum; // "A" | "B" | "C"
Это очень полезно.
Теперь я хочу создать универсальный тип, который будет работать с перечислениями таким образом, чтобы я мог вместо этого сказать:
type MyEnumKeysAsStrings = AnyEnumKeysAsStrings<MyEnum>;
Я думаю, правильный синтаксис для этого будет:
type AnyEnumKeysAsStrings<TEnum> = keyof typeof TEnum; // TS Error: 'TEnum' only refers to a type, but is being used as a value here.
Но это приводит к ошибке компиляции: «TEnum» относится только к типу, но используется здесь как значение ».
Это неожиданно и грустно. Я могу не полностью обойти это следующим образом, удалив typeof с правой стороны объявления универсального и добавив его к параметру type в объявлении определенного типа:
type AnyEnumAsUntypedKeys<TEnum> = keyof TEnum;
type MyEnumKeysAsStrings = AnyEnumAsUntypedKeys<typeof MyEnum>; // works, but not kind to consumer. Ick.
Мне не нравится этот обходной путь, потому что это означает, что потребитель должен помнить, чтобы сделать эту простую указание typeof на универсальном.
Есть ли какой-то синтаксис, который позволит мне указать общий тип, как я изначально хочу, чтобы быть добрым к потребителю?