簡體   English   中英

強制泛型類型的交集以擴展給定類型

[英]Enforce intersection of generic types to extend a given type

考慮以下(非編譯)TypeScript 示例:

type Optional<T> = { [K in keyof T]?: T[K] };

interface Foo {
    name: string;
    age: number;
}

function foo<A extends Optional<Foo>, B extends Optional<Foo>, A & B extends Foo>(a: A, b: B) : Foo {
    return {...a, ...b};
}

foo的想法是獲取Foo的兩個部分實例並強制它們的交集(至少)擴展Foo

有沒有一種可能的方法來構建這樣的約束?

如果這是可能的,是否可以將解決方案擴展到靈活數量的論點? foo不僅取 2 arguments,而且取n arguments。

function foo<A extends Optional<Foo>[]>(a: ...A) : Foo {
    ...
}

您可以為 rest 參數創建一個元組類型,該參數要求元組中最后一個元素的所有屬性都包含尚未指定的任何屬性:

interface Foo {
    name: string;
    lastName: string;
    age: number;
    id: number
}

function foo<A extends Partial<Foo>, B extends Partial<Foo> & Omit<Foo, keyof A>>(...a: [...A[], B]) : Foo {
    return Object.assign({}, ...a) as Foo;
}

let x = foo({ name: "" }, { lastName: "" }, { id: 0, age: 1})
let x2 = foo({ name: "" }, { lastName: "" }, { id: 0 }) // error

游樂場鏈接

雖然錯誤可能有點難以閱讀

暫無
暫無

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

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