TypeScript: как вернуть условные типы в функции с параметром rest?

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

  • null при наличии неопределенного значения
  • строка, если предоставляется одно число
  • массив строк при наличии нескольких чисел

Я пытался написать эту функцию в нескольких формах с использованием синтаксиса TypeScript extends, но, к сожалению, ни один из них не работал.

Я также пытался написать функцию, в которой первый параметр был числом, а второй - параметром отдыха, но это тоже не сработало.

Вот так сейчас выглядит рабочий код кроме правильного условного возврата типов:

import { rem } from "polished";

type UnitValue = number | undefined;

const unit = (...values: UnitValue[]): string | string[] | null => {
  const result: string[] = [];

  values.forEach(value => {
    if (value) {
      result.push(rem(value));
    }
  });

  if (result.length === 1) {
    return result[0];
  }

  if (result.length > 1) {
    return result;
  }

  return null;
};

Воссозданный регистр в codeansbox.io -> ссылке

Мне нужна эта функция, чтобы возвращать точно и только эти типы в трех случаях:

  • unit(undefined) -> null
  • unit(16) -> string
  • unit(16, 32) -> string[]

person Dawid Krajewski    schedule 29.05.2019    source источник


Ответы (1)


Этого можно добиться, используя перегрузки функций. Ваш код будет выглядеть так:

import { rem } from "polished";

function unit(...values: undefined[]): null;
function unit(...values: [number]): string;
function unit(...values: number[]): string[];
function unit(...values): null | string | string[] {
  const result: string[] = [];

  values.forEach(value => {
    if (value) {
      result.push(rem(value));
    }
  });

  if (result.length === 1) {
    return result[0];
  }

  if (result.length > 1) {
    return result;
  }

  return null;
}

Вы можете оформить заказ в эта площадка.

person Iago Bruno    schedule 29.05.2019