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