Definovat obecné funkce typ a aplikovat na funkce úkol

0

Otázka

Můžu definovat a používat generické funkce, jako je tento:

const fetchData = <T>(): T[] => {
  const arr: T[] = []
  // if stuff push to arr
  return arr
}

const emptyStringArray = fetchData<string>();

Nicméně, v mém skutečném scénáři, mám hodně params a chtěli oddělit typings a funkce úkol.

Já jsem se pokusil napsat takhle:

type IFetchData = <T>() => T[]

const fetchData2: IFetchData = () => {
  const arr: T[] = []
  // if stuff push to arr
  return arr
}

const emptyStringArray = fetchData2<string>();

Nicméně, nyní definice funkce nemusí rozpoznat T jako dostupný typ.

Nelze najít název "T".

Snažil jsem se spoustu různých konfigurací na kam dát <T>,, ale nic, zdá se do práce - nějaké nápady?

Demo v TS Hřiště


Související Dotazy

typescript typescript-generics
2021-11-24 02:12:27
3

Nejlepší odpověď

2

IFetchData dělá návrat psaní pro vás, takže by to mělo fungovat vynechat generic z fetchData2 funkce vrátit. Dělá následující práce?

type IFetchData = <T>() => T[]
const fetchData2: IFetchData = () => {
  return [];
}
2021-11-24 02:18:56

Blízko, ale v ideálním případě bych být schopen udržet obecné definice. To má zjednodušený snaží vytvořit malý příklad, ale já jsem vlastně vytváří počáteční pole a tlačí obects - Aktualizováno Příklad
KyleMit

Hmm, pokud budete potřebovat přístup k generic uvnitř fetchData2 zdá se, jako přístup, který by byl podobný své původní přístup (bez IFetchData: const fetchData2 = <T>() => { const arr: T[] = []; return arr;}
Nick
1

Za prvé, tato funkce:

const fetchData = <T,>(): T[] => {
    const arr: T[] = []
    arr.push(2) // error
    arr.push('str') // error

    return arr
}

je těžké k použití.

Protože bez tvé argumenty nejsou ve spojení s TTS vám nedovolí push žádné hodnoty arr. Samozřejmě, můžete použít typ tvrzení as, ale to je velmi nebezpečné:

const fetchData = <T,>(): T[] => {
    const arr: T[] = []
    arr.push('str' as any as T) // error

    return arr
}

const emptyStringArray = fetchData<number>(); // number[]
emptyStringArray[0].toExponential() // runtime error

Související otázka/odpověď, můj článek

Odpověď je snadná a jednoduchá: to je nemožné v tomto případě oddělit T z definice funkce bez řešení.

Zde máte nejjednodušší způsob, jak:

const fetchData = <T,>() => {
  const arr: T[] = []
  return arr
}

Nicméně, pokud chcete, aby mutovat své pole uvnitř fetchDatatato funkce podpis není užitečné. Tato funkce není dovoleno dělat nic s arr. Vše, co můžete udělat, je vrátit arr bez jakýchkoliv mutací.

Aby mutovat tomto seznamu, musíte vytvořit vyššího řádu funkce a během volání fetchData poskytnout explicitní obecný argument:

type FetchData = <T>() => T[]
const fetchData: FetchData = () => []

const higherOrder = <T,>(elem: T) => {
  const arr = fetchData<T>();
  arr.push(elem)

  return arr
}



const test = higherOrder('str'); // ok, string[]
const test2 = higherOrder(42); // ok, number[]

Dětské hřiště

2021-11-24 08:54:18
0

Mohl byste to zkusit?

type IFetchData = <T>() => T[]
const fetchData2: IFetchData = <T>() => {
  return [];
}
2021-11-24 08:13:59

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................