typescript - Tipul argumentului metodei bazat pe tipul de întoarcere al argumentului anterior


Am următoarea metodă (fără tip, deoarece despre asta este vorba în această întrebare):

export const mockSelector = (selector, matchers, returnValue) => {
    // Implementation
}

În această metodă, selector este o metodă care returnează o valoare, iar returnValue este, ei bine, valoarea returnată simulată pe care vreau să o configurez. Este folosit astfel: mockSelector(timerStoppedAtForPlayerSelector, [player.id, timerType], null).

Esenta întrebării mele este: cum pot face astfel încât tipul returnValue să fie orice tip de returnare are selector? Cu alte cuvinte, dacă selectorul pe care îl mock-uiesc este () => 'Hello', atunci TS ar genera eroare dacă se dă pentru returnValue altceva decât un string, iar dacă selectorul este () => 42, atunci TS ar genera eroare dacă returnType nu este un number.

M-am gândit să folosesc un generic pentru a tipa argumentele, dar problema pe care o întâmpin este că ori de câte ori semnătura selector se schimbă, TS nu mă va avertiza în legătură cu asta.

Aceasta este cea mai apropiată valoare pe care cred că am obținut-o:

export const mockSelector = (selector: <T>(...args: any[]) => T, matchers: unknown[], returnValue: ReturnType<typeof selector>) => {
    // Implementation
}

Cu toate acestea, utilizarea sa cauzează această eroare: TS2345 Argumentul de tip A nu poate fi atribuit parametrului de tip A.

Răspuns #1

Ar trebui să folosești un parametru de tip generic pentru asta:

function mock<T>(selector: () => T, returnValue: T) {

}

În acest fel, conectezi tipul de returnare al funcției selector și parametru returnValue.