[英]How do you use a Typescript Function Interface with a Generic type?
[英]How do you constrain a Generic type in a Typescript Function Interface?
假設我們有以下接口:
interface SomeInterface {a: string; b: number}
interface SomeFunction<T> {(arg: T) :T}
我們可以像這樣使用 function 接口:
const myFun: SomeFunction<string> = arg => arg;
但問題是我們將泛型類型T
指定為字符串,因此它不再是泛型的。 我想保持類型T
通用但也限制它。
像這樣聲明SomeFunction
:
interface SomeFunction {<T>(arg: T) : T}
允許它被普遍使用,如:
const myFun: SomeFunction = (arg) => arg;
但隨后我們失去了在 function 聲明中約束T
的機會。
我想要我的 function 實現SomeFunction
來定義T
必須擴展SomeInterface
我想要另一個 function 也實現SomeFunction
來定義T
擴展其他東西。
所以,基本上,我想要這樣的東西:
function myFun2<T extends SomeInterface>(arg: T): T {
console.log(arg.a);
return arg;
}
function myFun3<T extends {c: string }>(arg: T): T {
console.log(arg.c);
return arg;
}
我對上述解決方案的問題是,即使我們基本上匹配它,這些聲明中也沒有提到SomeFunction
接口。
有沒有更好的方法來聲明myFun2
和myFun3
以便我們確保它們符合SomeFunction
?
如果您希望能夠在調用站點定義約束,您可以使用約束類型泛化SomeFunction
,例如
interface SomeFunction<C> {
<T extends C>(arg: T) : T
}
並在定義函數時提供正確的約束
const myFun2: SomeFunction<SomeInterface> = arg => {
console.log(arg.a) // ok
return arg
}
const myFun3: SomeFunction<{ c: string }> = arg => {
console.log(arg.c) // ok
return arg
}
如果您想允許不受約束的函數,您還可以提供類型為unknown
的默認約束,例如
interface SomeFunction<C = unknown> {
<T extends C>(arg: T): T
}
const unconstrained: SomeFunction = arg => arg
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.