关于ts中泛型在函数使用的问题?

新手上路,请多包涵
const fun1: <T> (value1: T[], value2: T[] ) => T =  <T>(value1: T[], value2: T[]):T => {
    if (value1.length > value2.length) {
        return value1.length  
    } else {
        return value2.length  
    }
}

fun1<number>([1, 2, 3], [1, 2])

请问,为什么不能将类型“number”分配给类型“T”。( “T”可以使用与“number”无关的任意类型进行实例化。 ts:2322) ,

阅读 625
2 个回答

因为你可以传入string[],此时T代表string,你实际想写的函数应该是这个吧

const fun1 = <T,>(value1: T[], value2: T[]) => {
  if (value1.length > value2.length) {
    return value1.length;
  } else {
    return value2.length;
  }
};

你函数的return type标注为泛型T
从你的类型声明里看,T表示数组的某一项

而你实际返回的是数组的length,必为number

number当然不能代表泛型T。除非你把数组类型收窄到number[],但如果这样做,又没必要做成泛型了。

所以:

  • 如果你的目的是想返回数组的长度,那么把return type标记为number
  • 如果你确实想返回T,则表示你要返回数组里的某一项,你就想改代码运行时的逻辑,返回数组的某一项
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏