Określ uniwersalny typ funkcji i применитесь do przypisania funkcji

0

Pytanie

Mogę określić i wykorzystać taką uniwersalną funkcję, jak ta:

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

const emptyStringArray = fetchData<string>();

Jednak w moim realnym scenariuszu mam wiele opcji, i chciałbym podzielić typy i przypisywanie funkcji.

Starałem się napisać to tak:

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

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

const emptyStringArray = fetchData2<string>();

Teraz jednak definicja funkcji nie rozpoznaje T jak dostępny typ.

Nie można znaleźć nazwy "T".

Próbowałem wiele różnych konfiguracji do wynajęcia <T>, ale wydaje się, że nic nie działa - jakieś pomysły?

Demonstracja na placu zabaw TS


Związane z Tym Pytania

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

Najlepsza odpowiedź

2

IFetchData wykonuje reverse enter dla ciebie, więc musi pracować, aby wykluczyć rodzajowe wartość z fetchData2 funkcja zwrotu. Czy następny?

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

Blisko, ale najlepiej mógłbym zapisać całkowita w definicji. Jest to uproszczony podczas próby utworzenia mały przykład, ale tak naprawdę tworzę oryginalną tablicę i wysyłam do niego obiekty - Zaktualizowany przykład
KyleMit

Hmm, jeśli potrzebujesz dostępu do wspólnego wewnątrz fetchData2 wygląda na to, że podejście będzie podobny do początkowego podejście (bez IFetchData: const fetchData2 = <T>() => { const arr: T[] = []; return arr;}
Nick
1

Przede wszystkim, ta funkcja:

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

    return arr
}

trudne do wykorzystania.

Ponieważ żaden z twoich argumentów nie jest związana z TTS nie pozwoli push każda wartość dla arr. Oczywiście, można użyć zatwierdzenie typu asale to jest bardzo niebezpieczne:

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

Związany pytanie/odpowiedź, mój artykuł

Odpowiedź jest prosta i prosta: w tym przypadku nie można oddzielić T z definicji funkcji bez objazdów.

Tu masz najprostszy sposób:

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

Jednak, jeśli chcesz zmienić swoją tablicę wewnątrz fetchDatata sygnatura funkcji bezużyteczna. Ta funkcja nie pozwala, aby cokolwiek zrobić z arr. Wszystko, co możesz zrobić, to wrócić arr bez żadnych mutacji.

Aby zmienić tę listę, należy utworzyć funkcję wyższego rzędu i w czasie połączenia fetchData podaj wyraźny ogólny argument:

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

Plac zabaw

2021-11-24 08:54:18
0

Nie można spróbować?

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

W innych językach

Ta strona jest w innych językach

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