考慮以下(非編譯)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 個論點,而且還采用n論點。
function foo<A extends Optional<Foo>[]>(a: ...A) : Foo {
...
}
uj5u.com熱心網友回復:
您可以為 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
游樂場鏈接
雖然錯誤可能有點難以閱讀
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/407781.html
標籤:
上一篇:可能包含給定介面物件的物件
下一篇:訪問物件時如何獲得明確的型別?
