定义泛型函数类型并应用于函数赋值
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
相关问题
- Function with Generic Return Type
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 将不允许您 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
相关, 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[]
我可以像这样定义和使用通用函数:
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
相关问题
- Function with Generic Return Type
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 将不允许您 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
做任何事情。你所能做的就是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[]