Javascript 枚举的并集与枚举不同?

Javascript 枚举的并集与枚举不同?,javascript,typescript,enums,Javascript,Typescript,Enums,我有一些对象共享很多属性,但是有一个小的子集是不同的。它们通过其ID进行区分,ID是枚举中的一个值。我想将这些类型作为同一泛型的子类型,以便利用类型保护来了解哪些属性是可访问的 例如: enum ItemIDs{ 项目类型1, 项目类型2 } //具有共享属性的通用项 接口通用项{ id:id 数据:数据 } //“数据”属性可以是不同形状的特定项目 类型SpecificItemOne=GenericItem 类型SpecificItemTwo=GenericItem //特定项是所有特定项的并

我有一些对象共享很多属性,但是有一个小的子集是不同的。它们通过其ID进行区分,ID是枚举中的一个值。我想将这些类型作为同一泛型的子类型,以便利用类型保护来了解哪些属性是可访问的

例如:

enum ItemIDs{
项目类型1,
项目类型2
}
//具有共享属性的通用项
接口通用项{
id:id
数据:数据
}
//“数据”属性可以是不同形状的特定项目
类型SpecificItemOne=GenericItem
类型SpecificItemTwo=GenericItem
//特定项是所有特定项的并集
类型SpecificItem=SpecificItemOne | SpecificItemTwo;
//获取项目并测试typescript是否能够计算出可用的属性
//它起作用了!
const testTypeGuard=(项目:SpecificItem)=>{
if(item.id==ItemIDs.item\u TYPE\u 1){
item.data.content=“”
}else if(item.id==ItemIDs.item\u TYPE\u 2){
item.data.amount=0;
}
退货项目;
}
//尝试创建ID可以是来自ID枚举的任意ID的项
const breakTypeGuard=(id:ItemIDs,data:any)=>{
//类型“ItemIDs”不可分配给类型“ItemIDs.ITEM\u Type\u 2”。
//为什么
testTypeGuard({id,data});
}
或者

它似乎在说它无法将所有枚举值分配给特定的子类型。我不明白为什么这是一个问题,因为它与其他类型联合在一起,共同接受所有枚举值

我做错了什么


谢谢您的帮助。

我认为您的代码没有问题。TS有时不评估类型(可能是因为性能问题)

如果您想让这段代码正常工作,我建议添加
testTypeGuard({id,data}作为specifiitem)。这不是很不安全,因为TS不允许映射所有类型。例如:

设fn=(arg:42)=>42;
fn(1);//类型为“1”的参数不能分配给类型为“42”的参数。
fn(1作为数字)//类型为'number'的参数不能分配给类型为'42'的参数。

问题在于,当您将
{id,data}
作为参数发送时,这被视为对象文字类型

// This function you declared is expecting a SpecificItem type parameter
// and you are sending an object literal type parameter
const testTypeGuard = (item: SpecificItem) => {
    if (item.id === ItemIDs.ITEM_TYPE_1) {
        item.data.content = ''
    } else if (item.id === ItemIDs.ITEM_TYPE_2) {
        item.data.amount = 0;
    }
    return item;
}
因此,类型不匹配,这就是为什么会出现错误。 您需要做的是按照@przemyslaw pietrzak的建议发送指定类型的对象,如下所示:

// Try to create item where ID can be any from ID enum
const breakTypeGuard = (id: ItemIDs, data: any) => {
    // Type 'ItemIDs' is not assignable to type 'ItemIDs.ITEM_TYPE_2'.
    // WHY
    testTypeGuard({ id, data } as SpecificItem);
}