Wzorce
Jak pozwolić wywołującym wybrać wejście i transformację bez zapisywania argumentów typu?
Umieść parametry typu tam, gdzie ujawniają je wartości: jeden w elemencie tablicy, drugi w wyniku callbacku.
Przepis
function mapValues<T, U>( items: readonly T[], transform: (item: T) => U, ): U[] { return items.map(transform) } const lengths = mapValues(['a', 'four'], text => text.length) const flags = mapValues([1, 2], value => value > 1)
Build to kompiluje i sprawdza każdy wynik poniżej.
Jak to działa
- 01
items: readonly T[]Pierwszy argument dostarcza `T`; `readonly` przyjmuje tablice mutowalne i tylko do odczytu.
- 02
transform: (item: T) => U
Kontekst nadaje callbackowi wejście, a zwracane wyrażenie dostarcza `U`.
Co dostajesz
typeof lengths→number[]typeof flags→boolean[]ReturnType<() => ReturnType<typeof mapValues<string, number>>> extends number[] ? true : false
→true
Gdzie to zawodzi
Parametru typu użytego tylko w wyniku nie da się wywnioskować z argumentów. Wywołujący musieliby go zapisać albo przyjąć wartość domyślną niezwiązaną z prawdziwym wynikiem.
Wniosek
Dobre generyczne API wywnioskowuje parametry typu ze zwykłych wartości, a adnotacji używa tylko do wyrażania zależności.
