Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.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
Javascript 类型脚本交集类型强制转换为生成交集的类型之一_Javascript_Typescript - Fatal编程技术网

Javascript 类型脚本交集类型强制转换为生成交集的类型之一

Javascript 类型脚本交集类型强制转换为生成交集的类型之一,javascript,typescript,Javascript,Typescript,我希望有人能帮我找到一个干净的方法 我有两个这样的接口 interface A { prop1: string prop2: string } interface B { prop2: string prop3: string } 像这样的十字路口 myIntersection: A & B 我希望能够根据条件将此交叉点类型转换为A或B let whatIWant: any = {} if(myCondition) whatIWant = myIntersect

我希望有人能帮我找到一个干净的方法

我有两个这样的接口

interface A {
  prop1: string
  prop2: string
}

interface B {
  prop2: string
  prop3: string
}
像这样的十字路口

myIntersection: A & B
我希望能够根据条件将此交叉点类型转换为A或B

let whatIWant: any = {}
if(myCondition)
  whatIWant = myIntersection as A
else
  whatIWant = myIntersection as B
这样做时,不会出现任何错误,但新对象仍然包含交叉点对象的所有属性。有没有一个干净简单的方法可以做到这一点


这给我带来的问题是,我想将whatIWant对象保存为图像上的元数据,因此我需要删除我试图转换到的类型上不存在的所有属性。

使用类而不是接口应该满足您的要求。接口只描述对象具有的属性,而不是它没有的属性,因此最简单的方法是将所需的属性复制到新对象。在不了解您的实际结构的情况下,我可能会这样做:

// replace myIntersection with a base interface
interface MyData {
    prop1: string
    prop2: string
    prop3: string
}

// turn A and B into classes with constructors that take a MyData object
class A {
    prop1: string
    prop2: string
    constructor (data: MyData) {
        this.prop1 = data.prop1
        this.prop2 = data.prop2
    }
}
class B {
    prop2: string
    prop3: string
    constructor (data: MyData) {
        this.prop2 = data.prop2
        this.prop3 = data.prop3
    }
}

// Then initialize a new object based on your condition
const whatIWant = myCondition ? new A(myDataObject) : new B(myDataObject)

我找到了另一种方法。我不打算将此标记为可接受的答案,因为可能有更好的方法。我选择使用类而不是接口,并使用复制构造函数从交叉点类型创建新对象

范例

class A {
    prop1: string
    prop2: string
    constructor(obj: A)
    {
        this.prop1 = obj.prop1
        this.prop2 = obj.prop2
    }
}

class B {
    prop2: string
    prop3: string
    constructor(obj: B)
    {
        this.prop2 = obj.prop2
        this.prop3 = obj.prop3
    }
}

myIntersection: A & B

let whatIWant: any = {}
if(myCondition)
  whatIWant = new A(myIntersection)
else
  whatIWant = new B(myIntersection)

这符合我的目的。我只是希望有一种更干净的方法来实现这一点

对类型的强制转换只会更改编译器对对象的了解,而实际上不会更改对象本身(而且因为您已经将
whatIWant
定义为
any
,编译器仍然不知道它的任何信息)。这给你带来了什么问题?可能还有另一个解决方案,但这取决于您实际需要什么。谢谢您的评论John。我明白你的意思。这给我带来的问题是,我想将
whatIWant
对象保存为图像上的元数据,因此我需要删除所有不在我试图转换到的类型上的属性。我开始想也许我可以使用类而不是接口,使用复制构造函数。这与我刚刚提出的解决方案非常相似。我将对此进行研究,以确定是否最好使用一个接口来替换交叉点。感谢您抽出时间回答@abaga129我认为这两种方式都应该有效。这种方式让我感觉更干净,但在功能上应该没有任何区别(除非您的实际代码中有不同的处理方式),所以继续使用您更喜欢的方式。