在Typescript接口中使用字符串枚举计算的属性无法使用点表示法访问
我觉得这个问题和这个问题很相似:但我还是想确认一下这个行为 假设你有:在Typescript接口中使用字符串枚举计算的属性无法使用点表示法访问,typescript,Typescript,我觉得这个问题和这个问题很相似:但我还是想确认一下这个行为 假设你有: enum AcmeFields { ID = 'id', NAME = 'companyName', } 然后是一个接口: interface AcmeInterface { [AcmeFields.ID]: string, [AcmeFields.NAME]?: string; } 用这样的话说: const sampleCompany:AcmeInterface={id:1,name:'Sample
enum AcmeFields {
ID = 'id',
NAME = 'companyName',
}
然后是一个接口
:
interface AcmeInterface {
[AcmeFields.ID]: string,
[AcmeFields.NAME]?: string;
}
用这样的话说:const sampleCompany:AcmeInterface={id:1,name:'Sample Company'}
为什么我只能这样做?(Typescript为此提供自动完成功能)
而不是这个?(无自动完成或识别)
因为您的枚举表达式编译为JavaScript,它定义了一个具有属性
ID
和NAME
的对象,基本上如下所示:
var AcmeFields = {
ID: "id",
NAME: "name"
};
考虑到这一点,您应该清楚为什么需要使用ID
和NAME
来访问枚举成员:“ID”
和“NAME”
在很大程度上是结果对象的值,而不是属性。(您可以通过查看已编译的JavaScript或在中验证这一点。)
因此,当您编写以下任何内容时:
sampleCompany['id']
sampleCompany[AcmeFields.ID]
sampleCompany['name']
sampleCompany[AcmeFields.NAME]
您正在编写表达式以使用字符串动态访问对象的属性。所有这些将返回未定义的
。TypeScript允许这样的访问而不会出现编译错误,但这并不意味着表达式是有用的。相反,您应该以AcmeFields.ID
的形式访问枚举值,如果需要,也可以使用AcmeFields[“ID”]
的形式访问枚举值
只有当枚举成员是数字时,TypeScript编译器才会指定“反向映射”,因此如果您有:
enum AcmeNumbers {
FIRST = 1,
THIRD = 3
};
然后是AcmeNumbers。首先是和AcmeNumbers[1]
give1
由于可能会与字符串枚举混淆,一般来说,我建议定义属性名称与其值相同的字符串枚举。我认为这与。。。但不确定是否涵盖了这一确切问题
sampleCompany['id']
sampleCompany[AcmeFields.ID]
sampleCompany['name']
sampleCompany[AcmeFields.NAME]
enum AcmeNumbers {
FIRST = 1,
THIRD = 3
};