[英]Define generic function type and apply to function assignment
我可以像這樣定義和使用通用 function :
const fetchData = <T>(): T[] => {
const arr: T[] = []
// if stuff push to arr
return arr
}
const emptyStringArray = fetchData<string>();
但是,在我的實際場景中,我有很多參數,並且想將類型和 function 分配分開。
我試圖這樣寫:
type IFetchData = <T>() => T[]
const fetchData2: IFetchData = () => {
const arr: T[] = []
// if stuff push to arr
return arr
}
const emptyStringArray = fetchData2<string>();
但是,現在 function 定義不將T
識別為可用類型。
找不到名稱“T”。
我已經嘗試了很多不同的配置來放置<T>
,但似乎沒有任何效果 - 有什么想法嗎?
IFetchData
正在為您執行返回類型,因此它應該可以從fetchData2
function 返回中省略泛型。 下面的工作嗎?
type IFetchData = <T>() => T[]
const fetchData2: IFetchData = () => {
return [];
}
你能試試嗎?
type IFetchData = <T>() => T[]
const fetchData2: IFetchData = <T>() => {
return [];
}
首先,這個function:
const fetchData = <T,>(): T[] => {
const arr: T[] = []
arr.push(2) // error
arr.push('str') // error
return arr
}
很難使用。
由於您的 arguments 與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
與 function 定義分開。
在這里你有最簡單的方法:
const fetchData = <T,>() => {
const arr: T[] = []
return arr
}
但是,如果你想在fetchData
中改變你的數組,這個 function 簽名沒有用。 這個 function 不允許對arr
做任何事情。 您所能做的就是返回沒有任何突變的arr
。
為了改變這個列表,你需要創建更高階的 function 並且在調用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[]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.