Тип возврата такой же, как тип ввода в TypeScript

У меня есть две функции, которые делают одно и то же, с той лишь разницей, что типы ввода и типы возврата различаются. Мне было интересно, как я могу «объединить» эти функции в одну, и одна из идей заключалась в том, чтобы использовать тип объединения, но мое ограничение заключается в том, что, когда входные данные являются одним из членов объединения, возвращаемое значение должно быть таким же.

const getViewStyle = (styles: ViewStyle[]): ViewStyle => {
  return Object.assign({}, ...styles);
};

const getTextStyle = (styles: TextStyle[]): TextStyle => {
  return Object.assign({}, ...styles);
};

person Nick Dima    schedule 29.03.2018    source источник
comment
Используйте общий тип, он позволяет вам устанавливать любые параметры дохода / результата.   -  person Karabah    schedule 30.03.2018
comment
Или вы можете использовать :any type, если вас не волнует конкретный тип   -  person Karabah    schedule 30.03.2018


Ответы (4)


Это сработало для меня. Вся заслуга Мариуса Шульца - https://blog.mariusschulz.com/2016/08/18/function-overloads-in-typescript#version-4-function-overloads

function getStyle(styles: ViewStyle[]): ViewStyle;
function getStyle(styles: TextStyle[]): TextStyle;
function getStyle(styles: ViewStyle[] | TextStyle[]): ViewStyle | TextStyle {
    return Object.assign({}, ...styles);
}
person fidian    schedule 03.10.2018

Ты можешь сделать это:

const flattenObjectsToSingle = <T>(items: T[]): T => { ...
person Ryan Cavanaugh    schedule 29.03.2018
comment
Дело в том, что меня волнует тип, я не хочу, чтобы он был общим. Я хочу убедиться, что функция передает массив одного или любого из них и возвращает тот же тип. - person Nick Dima; 30.03.2018
comment
@NickDima Может T extends ViewStyle | TextStyle работать? - person Mathieu CAROFF; 05.06.2019
comment
Каков синтаксис объявления function () {}? - person Mathieu CAROFF; 05.06.2019
comment
Не могли бы мы дать ссылку на документацию по машинописному тексту? - person Mathieu CAROFF; 05.06.2019

Лучше всего было бы сочетание универсальных и предполагаемых типов. Принятый ответ позволил бы линтеру машинописного текста продолжать жаловаться, если вы ожидаете, что один из типов будет возвращен при использовании функции.

Так что, на мой взгляд, это был бы лучший ответ:

const getStyle = <T extends TextStyle | ViewStyle >(styles: T[]): T => { 
      return Object.assign({}, ...styles);
};

В основном это говорит о том, что функция ожидает массив TextStyle или ViewStyle и возвращает одну запись любого заданного типа.

Благодарим видео Бена Авада на YouTube: https://www.youtube.com/watch?v=nViEqpgwxHE

person Husein.Kasem    schedule 02.01.2020

Если я вас правильно понял ....

const getStyle = (styles: TextStyle[] | ViewStyle[]): TextStyle | ViewStyle[] => {
  return Object.assign({}, ...styles);
};

см. http://www.typescriptlang.org/docs/handbook/advanced-types.html, чтобы узнать о других интересных вещах.

person Steven Black    schedule 29.03.2018
comment
Я думаю, у вас неправильный тип возвращаемого значения. Разве это не должно быть TextStyle | ViewStyle вместо TextStyle | ViewStyle[]? - person Daniel W Strimpel; 30.03.2018
comment
Но что произойдет, если я вызову функцию с TextStyle [] и верну ViewStyle? Я не хочу этого допустить ... - person Nick Dima; 30.03.2018