Можно ли вывести возвращаемый тип на основе внешней переменной? По сути, у нас разные серверы с разными env, и этот регион имеет разные значения enum для одного свойства. Итак, у нас есть что-то вроде этого
export enum UKValues = {
ALL = '*',
NONE = 'none',
}
export enum USValues = {
THING = 'that',
}
export type Values = USValues | UKValues;
Я знаю, что могу сделать что-то вроде этого
const regionIsUK = (region: string): region is 'UK' => region === 'UK';
export const getValues: (region: 'UK') => UKValues | (region: 'US') => USValues = (region: 'UK' | 'US'): Values => regionIsUk(region) ? UKValues : USValues;
Поскольку значение основано на env, команда не хочет иметь использовать getValues(process.env.REGION)
везде, где они хотят использовать значения.
Итак! Мой вопрос: могу ли я использовать введенный тип в переменной с глобальной областью видимости, такой как process.env.REGION
, в моих типах, чтобы вывести возвращаемый тип?
export const getValues: process.env.REGION is 'UK' => UKValues | process.env.REGION is 'US' => USValues = () => isRegionUK(process.env.REGION) ? UKValues : USValues;
Я не думаю, что это возможно, потому что мы зависим от значения, устанавливаемого во время выполнения, а не от времени компиляции, которое раздражает. Я лично не возражаю против первого примера, но это не мое мнение, и команда предпочитает этот метод const getValues = (): UKValues | USValues => process.env.REGION === 'US' ? USValues : UKValues;
, который, как мне кажется, не очень конкретен c и может привести к использованию значений перекрестной области, потому что возвращаемый тип неверен и может привести к использованию как getValues().ALL
, где ALL
не является ключом USValues
.
В любом случае, дайте мне знать, что вы думаете об этом безумном вопросе. Я знаю, что большинство будет спрашивать, зачем нам это вообще нужно, и я согласен! Однако нам нужны разные возвращаемые значения в зависимости от региона, которые определены при возврате. Например,
switch (process.env.REGION) {
case 'US':
const result = {
value: getValues().THING,
};
break;
case 'UK':
const result = {
value: something ? getValues().ALL : getValues().NONE,
};
}
И, как вы можете видеть из вышеизложенного, мы уже используем условие для process.env.REGION
, поэтому на самом деле было бы лучше удалить метод для перечислений и использовать соответствующие перечисления здесь однако было решено, что мы должны использовать разные перечисления для каждой среды, что звучит абсурдно.