2016-11-12 10 views
0

Ich versuche, einen kleinen Cache-Wrapper in Typoskript (vereinfachte Pseudo Demo-Code) zu schreiben:Wie fügen Sie Typings für einen Funktionswrapper in TypeScript hinzu?

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) 
    } 
}) 

Dies funktioniert gut, wenn meine Funktion zum Beispiel nur ein Argument hat

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

jedoch als i i:V diese nur gültig für ein Argument angegeben.

Wenn ich eine zweite Funktion z. isPersonFancy es wird nicht funktionieren:

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

Wie muss ich meine cachify Funktionstypen ändern, so dass es für beide Fälle funktioniert?

Antwort

1

können Sie erklären, andere Unterschriften für die cachify Funktion:

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)

Verwandte Themen