Typescript 在正确识别对象类型之前,为什么需要强制枚举值?

Typescript 在正确识别对象类型之前,为什么需要强制枚举值?,typescript,enums,Typescript,Enums,我有一个对象,它在type属性上可以是给定枚举的任何值。当我创建一个有效对象并将其传递给函数时,typescript会抱怨类型不匹配。但是,如果强制使用枚举值,则可以 枚举AorB{ A=‘A’, B=‘B’, }; 类型Bar_A={ 类型:AorB.A; }; 类型Bar_B={ 类型:AorB.B; } 钢筋类型=钢筋A |钢筋B; 函数foo(a:Bar):void{} 常数arg={ 类型:AorB.A, }; //这会起作用,但是额外的写作 //常数arg={ //类型:AorB.A

我有一个对象,它在
type
属性上可以是给定枚举的任何值。当我创建一个有效对象并将其传递给函数时,typescript会抱怨类型不匹配。但是,如果强制使用枚举值,则可以

枚举AorB{ A=‘A’, B=‘B’, }; 类型Bar_A={ 类型:AorB.A; }; 类型Bar_B={ 类型:AorB.B; } 钢筋类型=钢筋A |钢筋B; 函数foo(a:Bar):void{} 常数arg={ 类型:AorB.A, }; //这会起作用,但是额外的写作 //常数arg={ //类型:AorB.A作为AorB.A // }; foo(arg);//错误 福({ 类型:AorB.A, })
请参阅等效的

类型脚本将扩展文本类型,除非它有理由保留它们,因此
arg
将被键入为
{type:AorB}
而不是
{type:AorB.a,}

如果显式使用类型断言AorB.a作为AorB.a,那么typescript将保留文字类型。如果将对象文字指定给需要
(例如函数的参数)的位置,typescript将再次保留文字类型

另一个可行的选项是显式键入
arg

const arg: Bar = {
  type: AorB.A,
};

foo(arg);
foo({
  type: AorB.A,
})

或者在3.4中使用
as const
,让编译器保留文本类型,而无需再次指定类型,尽管这将使整个对象成为只读对象

Typescript将扩展文本类型,除非它有理由保留它们,因此
arg
将被键入为
{type:AorB}
而不是
{type:AorB.a,}

如果显式使用类型断言AorB.a作为AorB.a,那么typescript将保留文字类型。如果将对象文字指定给需要
(例如函数的参数)的位置,typescript将再次保留文字类型

另一个可行的选项是显式键入
arg

const arg: Bar = {
  type: AorB.A,
};

foo(arg);
foo({
  type: AorB.A,
})

或者在3.4中使用
as const
,让编译器保留文本类型,而无需再次指定类型,尽管这将使整个对象成为只读对象

不幸的是,我不能将
用作常量。我得到了这个错误:
一个“const”断言只能应用于字符串、数字、布尔值、数组或对象文字。
我真的不明白为什么
AorB。A
被扩展到
AorB
。这似乎没有什么用处,但我肯定有一些后果我没有想到:)谢谢你的帮助answer@Awinograd
{type:AorB.A,}作为常量
工作<代码>{type:AorB.A as const,}
目前不工作,但很快就会工作。啊,你说得对!不确定我怎么会错过尝试(即使在错误消息中这样说)。谢谢@titianu,我不能将
用作常量
。我得到了这个错误:
一个“const”断言只能应用于字符串、数字、布尔值、数组或对象文字。
我真的不明白为什么
AorB。A
被扩展到
AorB
。这似乎没有什么用处,但我肯定有一些后果我没有想到:)谢谢你的帮助answer@Awinograd
{type:AorB.A,}作为常量
工作<代码>{type:AorB.A as const,}目前不工作,但很快就会工作。啊,你说得对!不确定我怎么会错过尝试(即使在错误消息中这样说)。谢谢你,提香