提问者:小点点

如何使自定义memoizeOne函数返回正确类型


我有一个记忆对象功能:

import memoizeOne from 'memoize-one';

type ArrayWithOneObj = [Record<string, unknown>];
const compareObject = ([obj1]: ArrayWithOneObj, [obj2]: ArrayWithOneObj) =>
  obj1 === obj2 ||
  (Object.keys(obj1).length === Object.keys(obj2).length &&
    Object.keys(obj1).every(key => obj2.hasOwnProperty(key) && obj1[key] === obj2[key]));

const identity = (x: Record<string, unknown>) => x;
const memoizeObj = memoizeOne(identity, compareObject);

// USING IT:

type FruityObj = {
  name: string;
};

const apple1: FruityObj = { name: 'apple' };
const apple2: FruityObj = { name: 'apple' };

// This works but the type of the memoized variables should be FruityObj instead
// of Record<string, unknown>
const memoizedApple1 = memoizeObj(apple1);
const memoizedApple2 = memoizeObj(apple2);
console.log(memoizedApple1 === memoizedApple2);

如何修改以使MemoizeObj返回传入的类型? 我不确定如何将泛型传递给memoizeobj? 谢谢

下面是一个可运行的示例:https://codesandbox.io/s/memoizeobj-bq3r8?file=/src/index.ts

MemoizeOne的声明:

export declare type EqualityFn = (newArgs: any[], lastArgs: any[]) => boolean;
export default function memoizeOne<ResultFn extends (this: any, ...newArgs: any[]) => ReturnType<ResultFn>>(resultFn: ResultFn, isEqual?: EqualityFn): ResultFn;

共1个答案

匿名用户

这比我想象的要简单得多,我试图将泛型类型添加到memoizeobj的常量赋值中,但我所需要的只是:

function identity<T>(x: T) {
  return x;
}