Definovať všeobecné funkcie typu a ktoré sa vzťahujú na funkciu priradenie

0

Otázka

Môžem definovať a použiť všeobecnú funkciu, ako je táto:

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

const emptyStringArray = fetchData<string>();

Avšak, podľa môjho skutočného scenár, mám veľa params a chcel by som samostatných sa typings a funkcia priradenie.

Ja som sa pokúsil napísať, ako je tento:

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

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

const emptyStringArray = fetchData2<string>();

Avšak, teraz funkciu definícia nerozpozná T dostupné typu.

Nemôžete nájsť, názov "T".

Snažil som sa veľa rôznych konfigurácií na kam dať <T>,, ale nič nepomohlo - akékoľvek nápady?

Demo v TS Ihrisko


Súvisiace Otázky

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

Najlepšiu odpoveď

2

IFetchData je to návrat písať pre vás, tak by to malo fungovať vynechať všeobecný z fetchData2 funkcia vrátiť. Vykonáva tieto práce?

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

V blízkosti, ale v ideálnom prípade by som byť schopný udržať všeobecné definície. To mám zjednodušený sa v snahe vytvoriť malý príklad, ale ja som vlastne vytvorenie počiatočnej pole a tlačí obects na to - Aktualizované Príklad
KyleMit

Hmm, ak potrebujete získať prístup k všeobecný vnútri fetchData2 zdá sa, že prístup, ktorý by bol podobný k vašej pôvodnej prístup (bez IFetchData: const fetchData2 = <T>() => { const arr: T[] = []; return arr;}
Nick
1

Po prvé, táto funkcia:

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

    return arr
}

je ťažké použiť.

Od non vaše argumenty nie sú spojené s TTS nedovolí push žiadne hodnoty na arr. Samozrejme, môžete použiť typ tvrdenie as,, ale je to veľmi 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

Súvisiaca otázka/odpoveď, môj článok

Odpoveď je ľahká a jednoduchá: nie je možné v tomto prípade na samostatné T z definícia funkcií bez riešenia.

Tu máte najjednoduchší spôsob:

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

Ak však chcete zmeniť svoje pole vo vnútri fetchData, táto funkcia podpis nie je užitočné. Táto funkcia nie je dovolené robiť niečo s arr. Všetko, čo môžete urobiť, je vrátiť sa arr bez mutácie.

V snahe zmeniť tento zoznam, musíte vytvoriť vyššieho rádu funkcie a počas telefonovania fetchData poskytujú explicitné všeobecný 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[]

Detské ihrisko

2021-11-24 08:54:18
0

Mohli by ste to skúsiť?

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

V iných jazykoch

Táto stránka je v iných jazykoch

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