typescript TS2461:类型“T”不是数组类型

fgw7neuy  于 2022-12-27  发布在  TypeScript
关注(0)|答案(4)|浏览(174)

我有一个泛型函数,其中参数数组可以是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"不是数组类型。
那么,我如何编写泛型函数呢?

lhcgjxsq

lhcgjxsq1#

你的类型提示并不保证“array”参数实际上是一个数组。因为你使用了泛型,所以我可以在那里传递任何值,比如一个数字,它会通过null检查并试图扩展那个数字,从而导致错误。
我的做法是检查参数是否为数组,而不是检查它是否不为空,如下所示:

const sort = <T>(array?: T | null) => {
    if (Array.isArray(array)) {
        return [...array].sort((a, b) => Date.parse(b.creation_date) - Date.parse(a.creation_date));
    };

    return;
};
kninwzqo

kninwzqo2#

请尝试使用如下:

export const sort= <Type>(array?: Type[] | null) => {
  if (isNil(array)) return;
  return [...array].sort((a, b) => {
    return Date.parse(b.creation_date) - Date.parse(a.creation_date);
  });
};
7xllpg7q

7xllpg7q3#

使用T作为元素类型并写入

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);
  });
};
zmeyuzjn

zmeyuzjn4#

若要编写可处理Alfa或Beta类型数组的泛型函数,可以执行以下操作:

export const sort = <T extends Alfa | Beta>(array?: T[] | null): T[] | undefined => {
  if (isNil(array)) return;
  return [...array].sort((a, b) => {
    return Date.parse(b.creation_date) - Date.parse(a.creation_date);
  });
};

这里,我们使用extends关键字指定泛型类型T可以是Alfa或Beta类型,还指定函数接受可选的T[]或null类型的数组,并返回T[]或undefined类型的数组。
请注意,ArrayLike类型不是TypeScript中的内置类型,也不是数组类型。它通常用于表示具有length属性且可迭代的对象,但不是实际数组。在这种情况下,它可能不是最适合用于函数的类型。

相关问题