在typescript中使用联合类型时,属性不存在

在typescript中使用联合类型时,属性不存在,typescript,union-types,Typescript,Union Types,假设我有两个接口: interface Box { x: number y: number } 及 就这个问题而言,假设我不能更改接口 现在,在构造对象时,我有如下代码: let a: Box|ColouredBox = {x: 1, y: 2} if( something ){ a.colour = "Blue" // Compilation Error } 我在a.color=“Blue”上遇到此错误: 为什么??这是TS编译器的限制吗?除了完全重建对象之外,我

假设我有两个接口:

interface Box {
    x: number
    y: number
}

就这个问题而言,假设我不能更改接口

现在,在构造对象时,我有如下代码:

let a: Box|ColouredBox = {x: 1, y: 2}
if( something ){
    a.colour = "Blue"  // Compilation Error
}
我在
a.color=“Blue”
上遇到此错误:

为什么??这是TS编译器的限制吗?除了完全重建对象之外,我还可以使用其他工作流吗

您可以使用:

这将根据属性
color
的存在而缩小到联合部件
彩色框
。通常,如果之前未缩小,则只能选择
Box | coloredbox
的所有公共属性
x
/
y

您可以使用:

这将根据属性
color
的存在而缩小到联合部件
彩色框
。通常,如果之前未缩小,则只能选择
Box | coloredbox
的所有公共属性
x
/
y


使用部分

您可以尝试使用

设a:Partial={x:1,y:2}
该部分将
彩色框的所有属性设置为可选

活生生的例子

更新

消除接口

如果只希望界面的颜色部分是可选的,则可以删除其中一个界面

接口盒{
x:数字;
y:数字;
颜色?:字符串;
}
然后,要确定您是否正在处理彩色框:

if (box.color) { ... }
类型断言

如果您坚持使用这两种接口,则可以使用
as
关键字(又称类型断言)将
a
具体视为
彩色框

设a:Box | coloredbox={x:1,y:2};
(a为彩色框)。color=“蓝色”;

使用部分

您可以尝试使用

设a:Partial={x:1,y:2}
该部分将
彩色框的所有属性设置为可选

活生生的例子

更新

消除接口

如果只希望界面的颜色部分是可选的,则可以删除其中一个界面

接口盒{
x:数字;
y:数字;
颜色?:字符串;
}
然后,要确定您是否正在处理彩色框:

if (box.color) { ... }
类型断言

如果您坚持使用这两种接口,则可以使用
as
关键字(又称类型断言)将
a
具体视为
彩色框

设a:Box | coloredbox={x:1,y:2};
(a为彩色框)。color=“蓝色”;

您的初衷是什么?从类型的角度来看,代码目前没有什么意义:如果它应该具有
color
属性,那么它应该是类型的一部分。如果不是-你不应该设定它。你的初衷是什么?从类型的角度来看,代码目前没有什么意义:如果它应该具有
color
属性,那么它应该是类型的一部分。如果没有-你不应该设置它。它显著地改变了语义:现在你可以做
a.x=undefined
选择这个作为最佳答案是因为
类型断言部分。它显著改变了语义:现在你可以做
a.x=undefined选择此作为最佳答案,因为
类型断言
部分。
如果(某物)
是检查是否应设置,而不是是否已设置。
如果(某物)
是检查是否应设置,而不是是否已设置。
if ("colour" in a) {
    a.colour = "Blue"  // works
}
if (box.color) { ... }