假设我们有一个对象x
类型X
和对象y
类型Y
。
我该如何合并(设置的所有属性)的y
进入x
,这样,如果Y
不是一个亚型(部分)中X
,编译器会抱怨?
注意:从Object.assign(x, y)
技术上讲是可行的,但如果Y
包含的属性不属于,则不会抱怨X
。
因此,我正在寻找一种{...x} = y
。
编辑:
x
不应重新分配到,因为那样会更改的身份,x
并且x
可能会更改const
。
您可以编写一个函数,如果一种类型不是另一种类型的子集,它将抱怨
//U is a subset of T
function merge<T extends U, U>(a:T, b:U):T{
return {...a, ...b}
}
如果您想覆盖,可以使用
function merge<T extends U, U>(a:T, b:U):T{
for (const [key, value] of Object.entries(b)) {
a[key as keyof U] = value
}
return a;
}
以下案例展示了它的工作原理
type A = {a:string, b:number, c:boolean}
type B = {a:number, b:number}
type C = {b:number, c:boolean}
type D = {a:string, d:string}
let a:A = {a:"Hi_a", b:1, c:true}
let b:B= {a:99, b:2}
let c:C = {b:3, c:false};
let d:D = {a:"Hi_d", d:"Low_d"}
let ab = merge(a,b) //compiler fail - Type B prop is incompatible
let ac = merge(a,c) //passes type C is a subset of type A
let ca = merge(c,a) //compiler fail - type A is a superset of type C
let ad = merge(a,d) // compiler fail - Type D has an extra property
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句