Definir genérico tipo de função e aplicar a função de atribuição de

0

Pergunta

Eu pode definir e usar uma função genérica como esta:

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

const emptyStringArray = fetchData<string>();

No entanto, na minha realidade, eu tenho um monte de parâmetros e gostaria de separar as tipagens e atribuição da função.

Eu tenho tentado escrever assim:

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

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

const emptyStringArray = fetchData2<string>();

No entanto, agora, a definição da função não reconhecer o T como um tipo.

Não é possível localizar o nome de 'T'.

Eu tentei um monte de configurações diferentes sobre onde colocar o <T>, mas nada parece funcionar - alguma idéia?

Demo no TS Parque infantil


Perguntas Relacionadas

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

Melhor resposta

2

IFetchData está fazendo o retorno a escrever para você, então ele deve funcionar para omitir o genérico do fetchData2 a função de retorno. Faz o seguinte trabalho?

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

Perto, mas idealmente, eu gostaria de ser capaz de manter o genérico na definição. Ele ficou simplificado em tentar criar um pequeno exemplo, mas eu estou, na verdade, a criação de uma matriz inicial e empurrando obects para ele - Atualizado Exemplo
KyleMit

Hmm, se você precisar acessar o genérico dentro fetchData2 parece que o procedimento seria semelhante a sua abordagem inicial (sem IFetchData: const fetchData2 = <T>() => { const arr: T[] = []; return arr;}
Nick
1

Primeiro de tudo, esta função:

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

    return arr
}

é difícil de usar.

Uma vez que os seus argumentos não estão relacionadas com o TTS não vai permitir que você push qualquer valor para o arr. Claro, você pode usar o tipo de declaração as, mas ele é muito inseguro:

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

Relacionados pergunta/resposta, o meu artigo

A resposta é fácil e simples: é impossível, neste caso, separada T a partir da definição de função, sem soluções.

Aqui você tem forma mais simples:

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

No entanto, se você quiser transformar a sua matriz no interior fetchDataesta função assinatura não é útil. Esta função não é permitido fazer qualquer coisa com arr. Tudo o que você pode fazer é retornar arr sem qualquer mutações.

A fim de transformar esta lista, você precisa criar ordem superior a função e durante a chamada fetchData fornecer explícita genérica de 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[]

Parque infantil

2021-11-24 08:54:18
0

Você poderia tentar?

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

Em outros idiomas

Esta página está em outros idiomas

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