Vyhledávání na webu

generics - Jak specifikovat typový strážce pro typ funkce s argumenty bez typů v TypeScriptu?


Typy funkcí jsou kontravariantní pro argumenty a kovariantní pro návratové typy. Jak specifikuji generický typ funkce s argumentem, který rozšiřuje typ Container, aniž bych v tomto případě použil any?

type Container<V> = {
  id: string;
  join: (value: V) => void;
};

const process = <V extends Container<unknown>>(processFn: (container: V) => boolean) => {
  // do something with processFn
}

type ExtendedContainer = Container<number> & { status: string; };
const processFn = (container: ExtendedContainer) => {
  return true;
}

process(processFn);

Chápu, proč to hlásí chybu. Co mi není jasné, je, jak mohu takový systém vyjádřit, aniž bych se uchýlil k any v deklaraci typu processFn pro process? Nebo jinak, jak mohu zajistit, aby argument container obecně rozšiřoval typ Container a získat jeho typový parametr?

Odpověď č. 1

Našel jsem poněkud složité a ošklivé řešení, využívající podmíněné typy, které funguje:

function process<C>(processFn: C extends Container<infer _> ? (value: C) => boolean : never) {
  // do something with processFn
}

process(processFn);

process((a: string) => true); // Argument of type '(a: string) => true' is not assignable to parameter of type 'never'.(2345)

Prostor pro Typescript