Definire una funzione generica tipo e applicare alla funzione di assegnazione

0

Domanda

Sono in grado di definire e utilizzare una generica funzione come questa:

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

const emptyStringArray = fetchData<string>();

Tuttavia, nel mio scenario attuale, ho un sacco di parametri e vorrei separare le tipizzazioni e la funzione di assegnazione.

Io ho tentato di scrivere come questo:

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

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

const emptyStringArray = fetchData2<string>();

Tuttavia, ora la definizione di funzione non riconosce il T come un tipo disponibile.

Impossibile trovare il nome di 'T'.

Ho provato un sacco di diverse configurazioni su dove mettere il <T>ma nulla sembra funzionare - tutte le idee?

Demo in TS Giochi


Le Domande Relative

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

Migliore risposta

2

IFetchData sta facendo ritorno a digitare per voi, così dovrebbe funzionare per omettere il generico dall' fetchData2 ritorno della funzione. Il seguente lavoro?

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

Chiudere, ma idealmente mi piacerebbe essere in grado di mantenere la generica definizione. Esso ha semplificato nel tentativo di creare un piccolo esempio, ma in realtà io sono la creazione di un array iniziale e spingendo obects per Esempio Aggiornato
KyleMit

Hmm, se avete bisogno di accedere alla generica all'interno di fetchData2 sembra che l'approccio dovrebbe essere simile al tuo approccio iniziale (senza IFetchData: const fetchData2 = <T>() => { const arr: T[] = []; return arr;}
Nick
1

Prima di tutto, questa funzione:

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

    return arr
}

è difficile da usare.

Dal momento che non di argomenti che non sono correlati TTS non vi permetterà di push qualsiasi valore al arr. Naturalmente, è possibile utilizzare l'asserzione del tipo asma è molto pericoloso:

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

Relative domande/risposte, il mio articolo

La risposta è semplice: è impossibile in questo caso per separare T dalla definizione di funzione senza soluzioni alternative.

Qui hai modo più semplice:

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

Tuttavia, se si desidera mutare il tuo array all'interno fetchDataquesta funzione firma non è utile. Questa funzione non è permesso di fare qualsiasi cosa con arr. Tutto quello che puoi fare è tornare a arr senza mutazioni.

Per mutare questo elenco, è necessario creare il più alto ordine di funzione e durante la chiamata fetchData fornire esplicito generico argomento:

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

Giochi

2021-11-24 08:54:18
0

Si potrebbe provare?

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

In altre lingue

Questa pagina è in altre lingue

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