[英]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.