簡體   English   中英

定義通用 function 類型並應用於 function 分配

[英]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> ,但似乎沒有任何效果 - 有什么想法嗎?

TS Playground 中的演示


相關問題

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM