我有一个泛型函数,其中参数数组可以是Alfa []或Beta []类型。
export interface Alfa {
id: number;
name: string;
propertyOne: string
propertyTwo: string
creation_date: string;
updation_date: string;
}
export interface Beta {
id: number;
propertyThree: string;
propetryFour: boolean;
creation_date: string;
updation_date: string;
}
import { isNil } from "lodash";
export const sort= <T>(array?: T | null) => {
if (isNil(array)) return;
return [...array].sort((a, b) => {
return Date.parse(b.creation_date) - Date.parse(a.creation_date);
});
};
所以在if (isNil(array)) return;
中我排除了null| undef,当函数遍历数组时,我有一个错误:TS2461:类型"T"不是数组类型。
所以,我试着:
export const sort= <T>(array?: ArrayLike<T> | null) => {
if (isNil(array)) return;
return [...array].sort((a, b) => {
return Date.parse(b.creation_date) - Date.parse(a.creation_date);
});
};
这是另一个错误:TS2461:类型"ArrayLike"不是数组类型。
那么,我如何编写泛型函数呢?
4条答案
按热度按时间lhcgjxsq1#
你的类型提示并不保证“array”参数实际上是一个数组。因为你使用了泛型,所以我可以在那里传递任何值,比如一个数字,它会通过null检查并试图扩展那个数字,从而导致错误。
我的做法是检查参数是否为数组,而不是检查它是否不为空,如下所示:
kninwzqo2#
请尝试使用如下:
7xllpg7q3#
使用T作为元素类型并写入
zmeyuzjn4#
若要编写可处理Alfa或Beta类型数组的泛型函数,可以执行以下操作:
这里,我们使用extends关键字指定泛型类型T可以是Alfa或Beta类型,还指定函数接受可选的T[]或null类型的数组,并返回T[]或undefined类型的数组。
请注意,ArrayLike类型不是TypeScript中的内置类型,也不是数组类型。它通常用于表示具有length属性且可迭代的对象,但不是实际数组。在这种情况下,它可能不是最适合用于函数的类型。