Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript属性相交时发生错误的类型_Typescript - Fatal编程技术网

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运算符只复制,因此您应该安全地使用该实现。

看起来不错。目前还没有更好的方法得到支持