【问题标题】:How to add typings for a function wrapper in TypeScript?如何在 TypeScript 中为函数包装器添加类型?
【发布时间】:2017-03-26 15:51:00
【问题描述】:

我正在尝试在 typescript 中编写一个小型缓存包装器(简化的伪演示代码):

const cache = {};
export function cachify<T, V>(name:string, getFunction: (i:V)=>Promise<T>): (i:V) => Promise<T> {
  return function() {
    return cache[name] || getFunction.apply(this,arguments)
  }
})

如果我的函数只有一个参数,例如

function isNameFancy(name:string) {
  return Promise.resolve(true)
}
const isNameFancyWithCache = cachify(isNameFancy)

但是,正如我指定的 i:V 这仅对一个参数有效。

如果我有第二个功能,例如isPersonFancy 不行:

function isPersonFancy(personAge: number, personName: string) {
  return Promise.resolve(true)
}
const isPersonFancyWithCache = cachify(isPersonFancy)

如何更改我的 cachify 函数类型以使其适用于两种情况?

【问题讨论】:

    标签: javascript typescript typescript-typings strong-typing


    【解决方案1】:

    您可以为cachify 函数声明其他签名:

    const cache = {};
    export function cachify<T, V>(name: string, getFunction: (i: V) => Promise<T>): (i: V) => Promise<T>;
    export function cachify<T, V1, V2>(name: string, getFunction: (i: V1, j: V2) => Promise<T>): (i: V1, j: V2) => Promise<T>;
    export function cachify(name: string, getFunction: (...args: any[]) => Promise<any>): (...args: any[]) => Promise<any> {
        return function () {
            return cache[name] || getFunction.apply(this,arguments)
        }
    };
    
    function isNameFancy(name: string) {
        return Promise.resolve(true)
    }
    const isNameFancyWithCache = cachify("isNameFancy", isNameFancy); // (i: string) => Promise<boolean>
    
    function isPersonFancy(personAge: number, personName: string) {
        return Promise.resolve(true)
    }
    const isPersonFancyWithCache = cachify("isPersonFancy", isPersonFancy); // (i: number, j: string) => Promise<boolean>
    

    (code in playground)

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 2019-07-17
      • 1970-01-01
      • 2021-10-06
      • 2021-05-17
      • 2017-03-07
      • 2020-05-02
      • 2015-10-23
      • 1970-01-01
      相关资源
      最近更新 更多