Возвращаемое значение TypeScript в зависимости от внешней константы - PullRequest
0 голосов
/ 16 июня 2020

Можно ли вывести возвращаемый тип на основе внешней переменной? По сути, у нас разные серверы с разными 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, поэтому на самом деле было бы лучше удалить метод для перечислений и использовать соответствующие перечисления здесь однако было решено, что мы должны использовать разные перечисления для каждой среды, что звучит абсурдно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...