Определите универсальный тип функции и применитесь к назначению функции

0

Вопрос

Я могу определить и использовать такую универсальную функцию, как эта:

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

const emptyStringArray = fetchData<string>();

Однако в моем реальном сценарии у меня много параметров, и я хотел бы разделить типы и назначение функций.

Я пытался написать вот так:

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

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

const emptyStringArray = fetchData2<string>();

Однако теперь определение функции не распознает T как доступный тип.

Не удается найти имя "Т".

Я перепробовал множество различных конфигураций для размещения <T>, но, похоже, ничего не работает - есть какие-нибудь идеи?

Демонстрация на игровой площадке TS


Связанные с Этим Вопросы

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

Лучший ответ

2

IFetchData выполняет обратный ввод для вас, поэтому он должен работать, чтобы исключить родовое значение из fetchData2 функция возврата. Работает ли следующее?

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

Близко, но в идеале я мог бы сохранить общее в определении. Это упростилось при попытке создать небольшой пример, но на самом деле я создаю исходный массив и отправляю в него объекты - Обновленный пример
KyleMit

Хм, если вам нужен доступ к общему внутри fetchData2 похоже, что подход будет похож на ваш первоначальный подход (без IFetchData: const fetchData2 = <T>() => { const arr: T[] = []; return arr;}
Nick
1

Прежде всего, эта функция:

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

    return arr
}

трудно использовать.

Поскольку ни один из ваших аргументов не связан с T, TS не позволит вам push любая ценность для arr. Конечно, вы можете использовать утверждение типа as, но это очень небезопасно:

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

Связанный вопрос/ответ, моя статья

Ответ прост и прост: в этом случае невозможно отделить T из определения функции без обходных путей.

Здесь у вас есть самый простой способ:

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

Однако, если вы хотите изменить свой массив внутри fetchData, эта сигнатура функции бесполезна. Эта функция не позволяет что-либо делать с arr. Все, что вы можете сделать, это вернуться arr без каких-либо мутаций.

Чтобы изменить этот список, вам нужно создать функцию более высокого порядка и во время вызова fetchData предоставьте явный общий аргумент:

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

Игровая площадка

2021-11-24 08:54:18
0

Не могли бы вы попробовать?

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

На других языках

Эта страница на других языках

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

Популярное в этой категории

Популярные вопросы в этой категории