【问题标题】:Return type same as input type in TypeScript返回类型与 TypeScript 中的输入类型相同
【发布时间】:2020-01-02 18:52:31
【问题描述】:

我有两个函数做同样的事情,唯一的区别是输入类型和返回类型不同。我想知道如何将这些函数“合并”成一个,其中一个想法是使用联合类型,但我的限制是,当输入是联合的一个成员时,返回的值必须相同。

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

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

【问题讨论】:

  • 使用泛型类型,它允许您设置任何收入/结果参数。
  • 或者如果你不关心具体类型,你可以使用:any类型

标签: typescript union-types


【解决方案1】:

你可以这样做:

const flattenObjectsToSingle = <T>(items: T[]): T => { ...

【讨论】:

  • 问题是我关心类型,我不希望它是通用的。我想确保该函数被传递一个或任一类型的数组并返回相同的类型。
  • @NickDima T extends ViewStyle | TextStyle 可以工作吗?
  • function () {} 声明的语法是什么?
  • 能否给我们一个打字稿文档的链接?
【解决方案2】:

泛型和推断类型的混合是最好的。如果您希望在使用该函数时返回其中一种类型,则接受的答案会让打字稿的 linter 不断抱怨。

所以,在我看来,这将是最好的答案:

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

这基本上是说该函数需要一个 TextStyle 或 ViewStyle 数组,并返回一个记录给定的任何类型。

归功于 YouTube 上的 Ben Awad 视频:https://www.youtube.com/watch?v=nViEqpgwxHE

【讨论】:

    【解决方案3】:

    这对我有用。所有功劳归功于 Marius Schulz - 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);
    }
    

    【讨论】:

      【解决方案4】:

      如果我理解正确的话......

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

      查看http://www.typescriptlang.org/docs/handbook/advanced-types.html 了解更多精彩内容

      【讨论】:

      • 我认为您的返回类型错误。不应该是TextStyle | ViewStyle 而不是TextStyle | ViewStyle[]?
      • 但是如果我用 TextStyle[] 调用函数并返回 ViewStyle 会发生什么?我不想让那个...
      猜你喜欢
      • 2018-02-23
      • 2022-01-03
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      相关资源
      最近更新 更多