簡體   English   中英

如何在 Typescript Function 接口中約束通用類型?

[英]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接口。

有沒有更好的方法來聲明myFun2myFun3以便我們確保它們符合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.

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