Typescript 来自枚举成员的计算密钥(作为接口密钥)

Typescript 来自枚举成员的计算密钥(作为接口密钥),typescript,enums,interface,Typescript,Enums,Interface,我试图通过使用计算键通过枚举选择对象属性的键来设置对象属性,如下面的代码片段所示 由于某些原因,解决方案1和2不起作用。这些是我希望在代码中使用的解决方案,因为我需要为从API调用动态获取的密钥分配一个值 奇怪的是,在我的无知中,解决方案4和5正在工作,这表明,实际上,解决方案1和2也可以“潜在”工作,方法是在硬编码的属性键之后,使用动态键重新分配属性值 这当然是因为TypeScript,只要提供匹配的接口属性,就可以接受任意数量的附加属性,但是,我仍然不明白为什么重复的动态属性在4和5中工作

我试图通过使用计算键通过枚举选择对象属性的键来设置对象属性,如下面的代码片段所示

由于某些原因,解决方案1和2不起作用。这些是我希望在代码中使用的解决方案,因为我需要为从API调用动态获取的密钥分配一个值

奇怪的是,在我的无知中,解决方案4和5正在工作,这表明,实际上,解决方案1和2也可以“潜在”工作,方法是在硬编码的属性键之后,使用动态键重新分配属性值

这当然是因为TypeScript,只要提供匹配的接口属性,就可以接受任意数量的附加属性,但是,我仍然不明白为什么重复的动态属性在4和5中工作

那么,为什么解决方案1和2不起作用?我做错了什么?

谢谢你的帮助


接口猫{
尾部:布尔型;
腿:四足动物;
}
界面四足动物{
总数:数字;
}
列举身体部位{
TAIL='TAIL',
总数='totalNumber'
}
let Brokernargo:Cat={tail:true,legs:{totalNumber:4}};
设argo:Cat={tail:true,legs:{totalNumber:4};
argo.legs=null;
设TN=‘总_数’;
设tn:车身部件=车身部件[tn];
//解决方案1=断开
brokernargo.legs={[tn]:6}
//解决方案2=断开
brokenArgo.legs={[BodyParts[TN]]:6};
//解决方案3=工作
argo.legs={[BodyParts['TOTAL_NUMBER']]:6};
//解决方案4=工作
argo.legs={
总数:0,
[tn]:6
};
//解决方案5=工作
argo.legs={
总数:0,
[车身部件[TN]]:6
};

您可以在

中看到上面的脚本,在一些TypeScript非官方文档之后,我意识到,由于声明的接口需要一个特定的属性(即接口不是optionial),我需要让TypeScript知道我实际上使用了一个计算键“作为”预期属性。 也就是说,我确信(我期望)从后端获得的正是该属性

上述(非常糟糕的例子,我很抱歉)可以这样修复:

(见附件)

接口猫{
尾部:布尔型;
腿:四足动物;
}
界面四足动物{
总数:数字;
}
列举身体部位{
TAIL='TAIL',
总数='totalNumber'
}
let Brokernargo:Cat={tail:true,legs:{totalNumber:4}};
设argo:Cat={tail:true,legs:{totalNumber:4};
argo.legs=null;
设TN=‘总_数’;
设tn:BodyParts.TOTAL_NUMBER=BodyParts[tn];
//解决方案1=断开
brokernargo.legs={[tn]:6}
//解决方案2=断开
brokenArgo.legs={[BodyParts[TN as'TOTAL_NUMBER']]:6};
//解决方案3=工作
argo.legs={[BodyParts['TOTAL_NUMBER']]:6};
//解决方案4=工作
argo.legs={
//totalNumber:0,//不需要更多
[tn]:6
};
//解决方案5=工作
argo.legs={
总数:0,
[车身部件[TN]]:6
};
所以,如果您事先不知道是否将从后端接收
propertyA
propertyB
(这是我最初的问题),并且您希望使用计算密钥,那么您可能需要或将接口声明中的密钥设置为可选,或将其设置为别名类型(或枚举)例如
type myType='propertyA'|'propertyB'
,然后将其用作界面中属性的键,如:

接口MyInterface{
myType:数字
}

问题在于
TN
被推断为
string
类型而不是
TOTAL\u NUMBER
?如果是这样,请尝试
const TN='TOTAL_NUMBER'
(而不是
let
)。当您使用类型脚本声明变量时,请将其类型推断为其原语,因为它可以随时更改,而原语类型是唯一重要的事情。当您将变量声明为常量时,不需要获取基元类型。按原样处理,变量类型为等于变量值的文本类型。感谢您的评论。这是一种伪代码。在实代码中,我将变量分配给类成员,如:
classMember:enum
然后
this.classMember=Enum.ELEMENT
最后,我尝试在对象属性赋值中这样使用它:
myObject={[this.classMember]:value}
。我试着在操场上把它改成一个const,它确实起作用了。我如何在课堂上得到同样的行为?再次感谢您的解释!声明类属性
readonly
?@jcalz感谢您的建议,在阅读您之前的评论后,我考虑了一下并尝试了,但是,由于我是通过角度的
@Input()
赋值的,而且由于我已经查找了更改,所以我使用了setter,所以我无法使用它。如您所知,我只能为构造函数中的只读成员赋值。