【问题标题】:Typesafe wrapper function in TypescriptTypescript 中的类型安全包装函数
【发布时间】:2019-07-17 23:04:41
【问题描述】:

我想将我的服务方法包装在一个cachify 方法中,该方法在查询数据库之前检查缓存。但是,我无法保留包装函数的类型声明。

包装cachify 函数如下所示:

// cache.ts
const cachify = async <T>(fn, args): Promise<T> => {
  const key = constructHashKey(args)
  const cachedEntry = get(key)

  if (cachedEntry) {
    return cachedEntry
  } else {
    const entry = await fn(...args)
    put(key, entry)
    return entry
  }
}

以下是包装函数的使用示例:

// userService.ts
const getUserProfilePhotoUrl = async (id: string, size: string): Promise<string> => {
  return cachify<string>(fetchPhotoUrl, [
    id,
    size
  ])
}

fetchPhotoUrl 函数具有签名(id: string, size: string): Promise&lt;string&gt;

但是,如果我向数组 [id, size] 添加一些任意参数,我不会收到任何类型错误。如何让 Typescript 意识到这一点?

【问题讨论】:

    标签: typescript types


    【解决方案1】:

    你可以得到你想要的行为你只需要在函数中添加一些类型参数来捕获实际传入的参数类型。

    const cachify = async <T, A extends [any] | any[]>(fn: (...a: A) => Promise<T>, args: A): Promise<T> => {
        const key = constructHashKey(args)
        const cachedEntry = get(key)
    
        if (cachedEntry) {
            return cachedEntry
        } else {
            const entry = await fn(...args)
            put(key, entry)
            return entry
        }
    
    }
    
    declare function fetchPhotoUrl(id: string, size: string): Promise<string>;
    const getUserProfilePhotoUrl = async (id: string, size: string): Promise<string> => {
        return cachify(fetchPhotoUrl, [
            id,
            size
        ])
    }
    

    如果你只是在这个版本中转发参数可能会让事情变得更容易:

    const cachify = <T, A extends [any] | any[]>(fn: (...a: A) => Promise<T>): ((...args: A) => Promise<T>) => {
        return async function (...args: A) {
            const key = constructHashKey(args)
            const cachedEntry = get(key)
    
            if (cachedEntry) {
                return cachedEntry
            } else {
                const entry = await fn(...args)
                put(key, entry)
                return entry
            }
        }
    }
    
    declare function fetchPhotoUrl(id: string, size: string): Promise<string>;
    const getUserProfilePhotoUrl = cachify(fetchPhotoUrl)
    
    getUserProfilePhotoUrl("id", "");
    

    getUserProfilePhotoUrl 是完全类型安全的,如果您将鼠标悬停在函数上,您将获得参数名称的工具提示,但在实际代码完成时不会(这应该在将来得到修复)。

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 1970-01-01
      • 2019-05-26
      • 2018-06-30
      • 2021-10-06
      • 2021-11-24
      • 2021-12-25
      • 2020-07-10
      • 2018-08-24
      相关资源
      最近更新 更多