如何在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,
}

如果我在any中使用filter((({ key_name }: any): boolean => key_name === getSavedFiltersKey(resource, namespace))) so,一切都会正常工作,但我希望使用正确的类型并编写:filter((({ key_name }: {key_name:string}): boolean => key_name === getSavedFiltersKey(resource, namespace)))

在这种情况下,我在filter函数中得到以下错误:

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的新手,我花了很多时间四处寻找,我发现了一些与谓词和造型类型相关的类似问题,我试图应用到我的案例中,但没有成功,不幸的是,有人能帮我解释一下解决方案吗?谢谢!

转载请注明出处:http://www.beijingklxcmc.com/article/20230526/2189253.html