首页 > 解决方案 > 如何在 Typescript 中为过滤函数编写类型以避免重载错误?

问题描述

我有这种情况:

type TMapStateToProps = (state: TObjectAny, props: {resource: string, namespace: string }) => ({
  savedFilters: TObjectAny
});

export const mapStateToProps: TMapStateToProps = (state, { resource, namespace = '_' }) => {
return {
    savedFilters: Object.values(
      get(state, 'admin.resources.settings/user-data.data', {})
    )
      .filter((({ key_name }: any): boolean => key_name === getSavedFiltersKey(resource, namespace)))
      .reduce((prev: any, cur: any) => {
        try {
          const filter = JSON.parse(cur.data.filter);
          prev[cur._id] = {
            name: cur.data.name,
            filter,
          };
        } catch (e) {
          console.error(e);
        }

        return prev;
      }, {}),

  };
};

产生的 Object.values(get(state, 'admin.resources.settings/user-data.data', {}))是一个空对象或一个对象数组,其中每个对象都具有以下结构:

type TObjectFilter = {
 created_at: string,
 data: TObjectAny
 id: string,
 key_name: string,
 public: boolean,
 updated_at: string,
 user: string,
 _id: string,
}

如果我使用 filter((({ key_name }: any): boolean => key_name === getSavedFiltersKey(resource, namespace))) so any,一切正常,但我想使用正确的类型并编写: filter((({ key_name }: {key_name:string}): boolean => key_name === getSavedFiltersKey(resource, namespace)))

在这种情况下,我在过滤器函数中收到以下错误:

No overload matches this call.
  Overload 1 of 2, '(predicate: (value: unknown, index: number, array: unknown[]) => value is unknown, thisArg?: any): unknown[]', gave the following error.
    Argument of type '({ key_name }: { key_name: string; }) => boolean' is not assignable to parameter of type '(value: unknown, index: number, array: unknown[]) => value is unknown'.
      Types of parameters '__0' and 'value' are incompatible.
        Type 'unknown' is not assignable to type '{ key_name: string; }'.
  Overload 2 of 2, '(predicate: (value: unknown, index: number, array: unknown[]) => unknown, thisArg?: any): unknown[]', gave the following error.
    Argument of type '({ key_name }: { key_name: string; }) => boolean' is not assignable to parameter of type '(value: unknown, index: number, array: unknown[]) => unknown'.
      Types of parameters '__0' and 'value' are incompatible.
        Type 'unknown' is not assignable to type '{ key_name: string; }'.

我对 TS 很陌生,我花了很多时间环顾四周,发现了一些与谓词和强制类型相关的类似问题,我试图申请我的案例,但不幸的是没有成功,有人可以帮助我,也许可以解释一下请问解决方案?谢谢!

标签: typescript

解决方案


你的数组不是同质的,这并不意味着它不能被输入,但如果你想接近条件 key_name 是第一个属性的名称,那就更难了。尝试这个:

type TObj<T extends string> = Record<T, number> & Record<"key_name", T>;

const testArray: [TObj<"a">, TObj<"b">, TObj<"c">] = [
    {
        a: 1,
        key_name: 'a',
    },
    {
        b: 2,
        key_name: 'b',
    },
    {
        c: 3,
        key_name: 'c'
    }
];

testArray.filter(obj => obj.key_name === "a);

但这并不能解决任何问题,对于 testFn 你应该使用TObject<any>

所以对于这个问题,是不可能的。


推荐阅读