Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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,我觉得这个问题和这个问题很相似:但我还是想确认一下这个行为 假设你有: 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]
give
1

由于可能会与字符串枚举混淆,一般来说,我建议定义属性名称与其值相同的字符串枚举。

我认为这与。。。但不确定是否涵盖了这一确切问题
sampleCompany['id']
sampleCompany[AcmeFields.ID]
sampleCompany['name']
sampleCompany[AcmeFields.NAME]
enum AcmeNumbers {
    FIRST = 1,
    THIRD = 3    
};