Definir la función genérica de tipo y se aplican a la función de asignación de

0

Pregunta

Puedo definir y utilizar una función genérica como este:

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

const emptyStringArray = fetchData<string>();

Sin embargo, en mi situación, tengo un montón de parámetros y quisiera separar las tipificaciones y la función de asignación.

He intentado escribir como este:

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

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

const emptyStringArray = fetchData2<string>();

Sin embargo, ahora la definición de la función no reconoce el T como un tipo disponible.

No se puede encontrar el nombre de 'T'.

Yo he probado un montón de diferentes configuraciones en donde poner el <T>pero nada parece funcionar - ¿alguna idea?

Demo de TS, zona de juegos infantil


Preguntas Relacionadas Con La

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

Mejor respuesta

2

IFetchData está haciendo el volver a escribir para ustedes, así que se debe trabajar para omitir el genérico de la fetchData2 función de retorno. Realiza las siguientes labores?

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

Cerca, pero lo ideal sería capaz de mantener el genérico de la definición. Consiguió simplificado a cabo en el intento de crear un pequeño ejemplo, pero en realidad estoy creando una primera matriz y empujar objetos a ella - se ha Actualizado el Ejemplo
KyleMit

Hmm, si usted necesita el acceso a los genéricos en el interior fetchData2 parece que el enfoque sería similar a la de su enfoque inicial (sin IFetchData: const fetchData2 = <T>() => { const arr: T[] = []; return arr;}
Nick
1

Primero de todo, esta función:

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

    return arr
}

es difícil de usar.

Ya que no de sus argumentos no están relacionados con TTS no le permitirá push cualquier valor a la arr. Por supuesto, usted puede utilizar el tipo de afirmación aspero es muy peligroso:

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

Relacionado con la pregunta/respuesta, mi artículo

La respuesta es fácil y sencilla: es imposible, en este caso para separar T a partir de la definición de función sin soluciones.

Aquí tienes forma más sencilla:

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

Sin embargo, si usted quiere mutar su matriz en el interior fetchDatacon esta función , la firma no es útil. Esta función no está permitido hacer cualquier cosa con arr. Todo lo que puedes hacer es volver arr sin ningún tipo de mutaciones.

Con el fin de mutar esta lista, es necesario crear un orden superior de la función y durante la llamada fetchData proporcionar explícita genérico argumento:

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

Zona de juegos infantil

2021-11-24 08:54:18
0

Podría usted probar?

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

En otros idiomas

Esta página está en otros idiomas

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