Defini generic funcție de tip și de a aplica pentru funcția de cesiune

0

Problema

Nu pot defini și utiliza o funcție generic astfel:

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

const emptyStringArray = fetchData<string>();

Cu toate acestea, în scenariu, am o mulțime de params și-ar dori să se separe typings și funcția de misiune.

Am încercat să scrie astfel:

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

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

const emptyStringArray = fetchData2<string>();

Cu toate acestea, acum la definirea funcției nu recunoaște T ca un tip disponibil.

Nu pot găsi numele de "T".

Am încercat o mulțime de diferite configurații pe unde să pună <T>dar nimic nu pare la locul de muncă - orice idei?

Demo-ul într-TS loc de Joacă


Întrebări Legate De

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

Cel mai bun răspuns

2

IFetchData este de a face întoarcerea de tastare pentru tine, așa că ar trebui să lucreze pentru a omite generic de fetchData2 funcția întoarce. Are următoarele munca?

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

Aproape, dar în mod ideal, aș fi capabil să țină generic în definiție. L-am simplificat în încercarea de a crea un mic exemplu, dar sunt, de fapt, crearea unei matrice inițială și împingând obects să - Actualizat Exemplu
KyleMit

Hmm, dacă aveți nevoie de acces la generic în interiorul fetchData2 se pare ca abordarea ar fi similară cu abordarea dumneavoastră inițială (fără IFetchData: const fetchData2 = <T>() => { const arr: T[] = []; return arr;}
Nick
1

Mai întâi de toate, această funcție:

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

    return arr
}

este greu de a utiliza.

Deoarece afara de argumentele tale nu sunt legate de T, TS nu vă va permite să push orice valoare arr. Desigur, puteți utiliza tipul de afirmare as, dar este foarte nesigur:

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

Legat de întrebare/răspuns, articolul meu

Răspunsul este ușor și simplu: este imposibil în acest caz pentru a separa T din definiția funcției, fără soluții.

Aici aveți mai simplu mod:

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

Cu toate acestea, dacă doriți pentru a evolua matrice în interiorul fetchDataaceastă funcție semnătura nu este util. Această funcție nu este permis să faci orice cu arr. Tot ce poți face este să se întoarcă arr fără nici o mutație.

În scopul de a evolua această listă, aveți nevoie de a crea ordin superior în funcție și de timpul de asteptare fetchData oferă explicit argument generic:

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[]

Loc de joaca

2021-11-24 08:54:18
0

Ai putea încerca?

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

În alte limbi

Această pagină este în alte limbi

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