首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回相同函数类型的泛型回传函数

返回相同函数类型的泛型回传函数
EN

Stack Overflow用户
提问于 2017-04-13 02:28:16
回答 1查看 1.3K关注 0票数 5

我试图写一个回忆录函数,它以一个函数作为参数,并返回一个类似的回忆录函数。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-13 02:59:24

这似乎在起作用:

代码语言:javascript
复制
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");
});

(操场密码

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43382569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档