Définir la fonction générique de saisir et d'appliquer à la fonction d'affectation

0

La question

Je peux définir et utiliser une fonction générique comme ceci:

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

const emptyStringArray = fetchData<string>();

Cependant, dans mon scénario, j'ai beaucoup de paramètres et voudrais séparer les typings et la fonction de l'affectation.

J'ai tenté d'écrire comme cela:

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

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

const emptyStringArray = fetchData2<string>();

Cependant, maintenant la définition de la fonction ne reconnaît pas l' T comme un type.

Impossible de trouver le nom de "T".

J'en ai essayé beaucoup de différentes configurations sur l'endroit où placer le <T>mais rien ne semble fonctionner - des idées?

La démo en TS aire de Jeux


Questions Connexes

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

La meilleure réponse

2

IFetchData est en train de faire le retour de taper pour vous, donc, il faut travailler à omettre le générique de la fetchData2 de retour de la fonction. Réalise les travaux suivants?

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

À proximité, mais idéalement, j'aimerais être capable de garder le générique dans la définition. Il s'est simplifié en essayant de créer un petit exemple, mais je suis en fait à la création d'un premier tableau et en le poussant obects à elle - mis à Jour Exemple
KyleMit

Hmm, si vous avez besoin d'accéder au générique de l'intérieur fetchData2 il semble que l'approche serait similaire à votre approche initiale (sans IFetchData: const fetchData2 = <T>() => { const arr: T[] = []; return arr;}
Nick
1

Tout d'abord, cette fonction:

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

    return arr
}

est difficile à utiliser.

Depuis non de vos arguments ne sont pas liés à T, TS ne vous permettra pas de push de la valeur à l' arr. Bien sûr, vous pouvez utiliser l'assertion de type asmais il est très dangereux:

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

Liées question/réponse, mon article

La réponse est simple: il est impossible dans ce cas de séparer T de définition de la fonction de sans solutions de contournement.

Ici vous disposez de la manière la plus simple:

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

Cependant, si vous souhaitez muter votre tableau à l'intérieur d' fetchDatacette signature de fonction n'est pas utile. Cette fonction n'est pas autorisé à faire n'importe quoi avec arr. Tout ce que vous pouvez faire est de retour arr sans mutations.

Dans le but de muter de cette liste, vous devez créer d'ordre supérieur de la fonction et les cours d'appel fetchData explicite argument générique:

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

Aire de jeux

2021-11-24 08:54:18
0

Pourriez-vous essayer?

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

Dans d'autres langues

Cette page est dans d'autres langues

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