如何键入使用 Array.push() 的泛型函​​数?

Posted

技术标签:

【中文标题】如何键入使用 Array.push() 的泛型函​​数?【英文标题】:How to type a generic function that uses Array.push()? 【发布时间】:2020-11-27 16:14:44 【问题描述】:

在研究泛型时:

function newArr<T>(arr: T[], itemToAdd: string): T[] 
  return arr.push(itemToAdd);


const arr: string[] = ["item 1", "item 2", "item 3"];

const itemToAdd: string = "item 4";

newArr<string>(arr, itemToAdd);

当我将鼠标悬停在 itemToAdd 上时,我遇到了这个错误。

Argument of type 'number' is not assignable to parameter of type 'T'.
  'number' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint ''.

以体面的类型安全性来解决这个问题的最佳方法是什么?

【问题讨论】:

函数参数应该是itemToAdd: T 我试过了,但我得到了错误Type 'number' is not assignable to type 'T[]' 那是因为 return 类型,.push 不返回数组。此外,您不需要显式提供泛型类型,因为它可以从参数中推断出来。 要么使用.concat 返回一个末尾附加itemToAdd 数组,要么使用arr.push(itemToAdd); return arr;.push 方法总是返回数组的新长度,所以你不能使用它的返回值作为T[] 我已经尝试了其中一些建议,但没有奏效。我将编辑问题以包括这些。谢谢 【参考方案1】:

我通过这样做得到了答案:

function newArr<T>(arr: T[], itemToAdd: T): T[] 
  arr.push(itemToAdd);
  return arr;

我忘记设置 itemToAdd: T 并且没有返回数组。

【讨论】:

以上是关于如何键入使用 Array.push() 的泛型函​​数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TypeScript 3+ 中正确键入通用元组剩余参数?

如何在 C# 的泛型中使用扩展

java 如何获得List的泛型类型

django rest框架中的泛型与视图集,如何选择使用哪一个?

如何使用 Java 互操作处理可为空的泛型

Java中的泛型