定义泛型函数类型并应用于函数赋值

Define generic function type and apply to function assignment

我可以像这样定义和使用通用函数:

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 识别为可用类型。

Cannot find name 'T'.

我已经尝试了很多不同的配置来确定 <T> 的放置位置,但似乎没有任何效果 - 有什么想法吗?

Demo in TS Playground


相关问题

IFetchData 正在为您进行 return 打字,因此从 fetchData2 函数 return 中省略泛型应该可行。以下是否有效?

type IFetchData = <T>() => T[]
const fetchData2: IFetchData = () => {
  return [];
}

可以试试吗?

type IFetchData = <T>() => T[]
const fetchData2: IFetchData = <T>() => {
  return [];
}

首先这个函数:

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

    return arr
}

很难用。

由于您的所有参数都与 T 无关,TS 将不允许您 pusharr 提供任何值。当然可以使用类型断言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

相关, my article

答案很简单:在这种情况下,如果没有解决方法,就不可能将 T 从函数定义中分离出来。

这里有最简单的方法:

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

但是,如果你想在 fetchData 中改变你的数组,这个函数签名就没有用了。不允许此函数对 arr 做任何事情。你所能做的就是returnarr没有任何突变。

为了改变此列表,您需要创建高阶函数并在调用期间 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[]

Playground