Typescript属性相交时发生错误的类型
我想创建一个类型,如果在另一个类型中定义了相同的属性,则该类型将出错。这是为了构建一个类型安全的合并(也许已经有了?)下面的方法可以工作,但我想知道是否有更好的方法?这里是否会有实现无法处理的边缘情况Typescript属性相交时发生错误的类型,typescript,Typescript,我想创建一个类型,如果在另一个类型中定义了相同的属性,则该类型将出错。这是为了构建一个类型安全的合并(也许已经有了?)下面的方法可以工作,但我想知道是否有更好的方法?这里是否会有实现无法处理的边缘情况 type UniqueObject<T extends {[K in keyof U]?: any}, U> = {[K in keyof U]: undefined extends T[K] ? U[K]: never} function safeMerge <T, U, V,
type UniqueObject<T extends {[K in keyof U]?: any}, U> = {[K in keyof U]: undefined extends T[K] ? U[K]: never}
function safeMerge <T, U, V, W> (a: T, b?: UniqueObject<T, U>, c?: UniqueObject<T & U, V>, d?: UniqueObject<T & U & V, W>) {
return { ...a, ...b, ...c, ...d /* etc */ }
}
safeMerge({ ar: 1 }, { ar: 2 }) // errors correctly
safeMerge({ ar: 1 }, { ar: undefined }) // errors correctly
safeMerge({ ar: 1 }, { b: 2 }) // works correctly
safeMerge({ ar: 1 }, { b: 2 }, { ar: 3 }) // errors correctly
safeMerge({ ar: 1 }, { b: 2 }, { b: undefined }) // errors correctly
safeMerge({ ar: 1 }, { b: 2 }, { c: 3 }) // works correctly
safeMerge({ ar: 1 }, { b: 2 }, { c: 3 }, { ar: 1 }) // errors correctly
safeMerge({ ar: 1 }, { b: 2 }, { c: 3 }, { d: 4 }) // works correctly
type UniqueObject={[K in keyof U]:未定义扩展T[K]?U[K]:never}
函数safeMerge(a:T,b?:UniqueObject,c?:UniqueObject,d?:UniqueObject){
返回{…a,…b,…c,…d/*etc*/}
}
安全合并({ar:1},{ar:2})//错误正确
安全合并({ar:1},{ar:undefined})//错误正确
safeMerge({ar:1},{b:2})//工作正常
安全合并({ar:1},{b:2},{ar:3})//错误正确
安全合并({ar:1},{b:2},{b:undefined})//错误正确
safeMerge({ar:1},{b:2},{c:3})//工作正常
safeMerge({ar:1},{b:2},{c:3},{ar:1})//错误正确
safeMerge({ar:1},{b:2},{c:3},{d:4})//工作正常
我认为这是一个数学描述。在中不存在这样的安全合并,虽然libs中可能存在一些类似的类型,例如,但我没有看到任何实现这种类型的方法
另外,由于spread运算符只复制,因此您应该安全地使用该实现。看起来不错。目前还没有更好的方法得到支持