Функция определяет тип возвращаемого значения по параметрам - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть два интерфейса:

interface ChildConfig {
  x: number;
  y: number;
}
interface Config {
  [name: string]: ChildConfig;
}

Я хочу иметь функцию с необязательным параметром. Когда параметр существует, я хочу, чтобы функция возвращала ChildConfig, если нет, я хочу вернуть Config.

function getConfig(name?: string): ??? {
  if (name) return config[name];
  return config;
};

Что мне делать?

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

За документы вы можете использовать перегрузки функции , чтобы фактически сделать этот тип безопасным:

function getConfig(): Config
function getConfig(name: string): ChildConfig
function getConfig(name?: string): Config | ChildConfig {
  if (name) {
    return config[name];
  }
  return config;
};

Теперь тип возвращаемого значения будет отличаться в зависимости от того, какВы называете это, и вам не нужно будет использовать as утверждений или защиту типов, чтобы выяснить, что было возвращено, как вы делаете, когда используете только тип объединения типа Config | ChildConfig.

0 голосов
/ 17 апреля 2019

Чтобы отличить другие ответы, предоставив другой возможный способ, вы можете установить тип возвращаемого значения Config|ChildConfig.

interface ChildConfig {
  x: number;
  y: number;
}
interface Config {
  [name: string]: ChildConfig;
}

const config = {} as any;

function getConfig(name?: string): Config|ChildConfig {
  if (name) return config[name];
  return config;
};

Использование потребует от вас явного решения, является ли тип возвращаемого значения Config или ChildConfig, например:

const childConfig = getConfig('myTest') as ChildConfig;

Таким образом childConfig будет иметь тип ChildConfig.

В противном случае вы можете комбинировать такой механизм с защитными приспособлениями (подробнее здесь )

function isChildConfig(arg: any): arg is ChildConfig {
    return arg && arg.x && arg.y;
}

Затем используйте тип guard на результате, чтобы продолжить, только если это дочерняя конфигурация:

const _config = getConfig('test');
if (isChildConfig(_config)) {
    _config. // <-- intellisense here
}

Это обеспечит наличие у _config свойств x и y:

enter image description here

TS Playground

0 голосов
/ 17 апреля 2019

Попробуйте что-то вроде этого

function getConfig(name?: string): ChildConfig|Config {
  if (name) return config[name];
  return config;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...