Wat*_*oll 2 memoization typescript
我正在尝试编写一个 memoize 函数,该函数将一个函数作为参数并返回一个类似的 memoized 函数。
function memoize<T extends Function, R>(f: T): T {
  const memory = new Map<string, R>();
  const g = (...args: any[]) => {
    if (!memory.get(args.join())) { memory.set(args.join(), f(...args)); }
    return memory.get(args.join());
  };
  return g; // g as T => [ts] Type '(...args: any[]) => R' cannot be converted to type 'T'.
}
// const exp: (...args: any[]) => RegExp
const exp = memoize<(text: string) => RegExp, RegExp>((text: string) => {
  return new RegExp(text.replace(/[^a-zA-Z0-9\s]/g, ".").replace(/\s+/g, "\\s+"), "ig");
});
问题是,如果我只是返回g, exp 的签名就变成了(...args: any[]) => RexExp,如果我试图强制 g 为 T,则ts抱怨 g 不可分配给T。
有没有办法“强制”g成为相同类型的f,以便exp将完全相同类型的函数传递给memoize?
这似乎有效:
function memoize<R, T extends (...args: any[]) => R>(f: T): T {
    const memory = new Map<string, R>();
    const g = (...args: any[]) => {
        if (!memory.get(args.join())) {
            memory.set(args.join(), f(...args));
        }
        return memory.get(args.join());
    };
    return g as T;
}
const exp = memoize((text: string) => {
    return new RegExp(text.replace(/[^a-zA-Z0-9\s]/g, ".").replace(/\s+/g, "\\s+"), "ig");
});
(操场上的代码)
| 归档时间: | 
 | 
| 查看次数: | 846 次 | 
| 最近记录: |