簡體   English   中英

什么時候應該在 TypeScript 中使用泛型參數?

[英]When should I use generic parameters in TypeScript?

我從本教程中得到了這個 Typescript 示例

interface Logable {
  log: () => void;
}
function logItems<T extends Logable>(items: T[]): void {
  items.forEach(item => item.log());
}

而且我想知道在這種情況下,使用通用約束或僅使用logItems(items: Logable[])之間是否有任何區別

看起來,如果您不需要更復雜的約束,只需指定參數的類型就更簡單了。

我對嗎?

你認為它並沒有真正產生影響是對的。 從更廣泛的意義上講,只要您不使用 generics 到 model 關系之間的參數或返回類型,您可能首先不需要泛型類型。

但是有一個細微的差別。 如果我們使用通用的 function,只要滿足約束,就可以傳遞任意形狀的對象數組。

function logItems<T extends Logable>(items: T[]): void {
  items.forEach(item => item.log());
}

logItems([
  { log: () => {} },
  { a: "123", log: () => {} }
])

在這種情況下允許使用額外的屬性。

當我們不使用泛型類型時,會發生一些不同的事情。

function logItems2(items: Logable[]): void {}

logItems2([
  { log: () => {} },
  { a: "123", log: () => {} }
//  ^^^^^^^^ Error: Object literal may only specify known properties, and 'a' does not exist in type 'Logable'
])

由於在將object 文字傳遞給 function 時,會對多余的屬性進行額外檢查,因此存在編譯器錯誤。

但是您仍然可以將數組作為變量傳遞給 function。

const arr = [
  { log: () => {} },
  { a: "123", log: () => {} }
]

logItems2(arr)

操場

當 arguments 或返回類型取決於一個類型。

在那個例子中,你是對的,通用參數不是必需的。


一個更好的例子:

function logKey<T>(obj: T, key: keyof T) {
    console.log(obj[key])
}

logKey({ abc: 123 }, 'abc')

在為 object 提供一些密鑰之前,您無法知道允許使用哪些密鑰。 在這種情況下,第二個參數取決於第一個參數的類型。


或者:

function getFoo<T extends { foo: unknown }>(obj: T): T['foo'] {
    return obj.foo 
}

getFoo({ foo: 'a string' }) // string
getFoo({ foo: 123 }) // number

此處的返回值因您提供的參數而異。

這里的返回類型取決於參數的類型。 在這種情況下,返回類型取決於第一個參數的類型。


如果沒有類型依賴於您的 function 中的任何其他類型,那么您的 function 不需要是通用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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