Typescript 接口[key in StringEnum]当不是StringEnum的所有元素都作为键存在时?

Typescript 接口[key in StringEnum]当不是StringEnum的所有元素都作为键存在时?,typescript,typescript-generics,mapped-types,Typescript,Typescript Generics,Mapped Types,考虑以下示例数据,这些数据表示包含待定和已完成采购订单ID列表的店铺: { "shop-45": { "FULFILLED": [55, 70] }, "shop-46: { "PENDING": [59, 54] "FULFILLED": [100, 101] } } 如果商店既没有待处理订单,也没有完成订单,那么它根本不会出现在列表中 我试图用以下方式表示这一点: type Status = "PENDING"

考虑以下示例数据,这些数据表示包含待定和已完成采购订单ID列表的店铺:

{
    "shop-45": {
        "FULFILLED": [55, 70]
    },
    "shop-46: {
        "PENDING": [59, 54]
        "FULFILLED": [100, 101]
    }
}
如果商店既没有待处理订单,也没有完成订单,那么它根本不会出现在列表中

我试图用以下方式表示这一点:

type Status = "PENDING" | "FULFILLED";

interface ShopList {
    [shop: string]: {
        [status in Status]: number[];
    }
}
type ShopWithPending = {
    PENDING: number[];
}

type ShopWithFulfilled = {
    FULFILLED: number[];
}

type ShopStatus = ShopWithPending | ShopWithFulfilled | (ShopWithPending & ShopWithFulfilled);

interface ShopList {
    [shop: string]: ShopStatus
}
毫不奇怪,
tsc
在我没有将
待定
履行
作为店铺的子属性时会抱怨

我通过将该属性设置为可选属性(
[status in status]?:number[]
)来消除错误,但我并不认为这是我真正想要做的,因为商店永远不会有零子属性

另一个异想天开的黑暗中射击尝试
[部分状态]:数字[]投诉类似

这是我唯一的选择,而且根本不需要担心吗

这是一个微不足道的MCVE;真正的一个要复杂得多,有更多的层次。这就是(总是?)使用泛型而不是重复每个可能的键名背后的动机:枚举在其他对象中用作字段值


TypeScript/issues参考文献讨论了类似的情况:| | |。

如果你想阻止这样一种情况,即商店在没有
待决
履行
的情况下不会出现,你需要对你的类型更加明确一点。例如,您可以执行以下操作:

type Status = "PENDING" | "FULFILLED";

interface ShopList {
    [shop: string]: {
        [status in Status]: number[];
    }
}
type ShopWithPending = {
    PENDING: number[];
}

type ShopWithFulfilled = {
    FULFILLED: number[];
}

type ShopStatus = ShopWithPending | ShopWithFulfilled | (ShopWithPending & ShopWithFulfilled);

interface ShopList {
    [shop: string]: ShopStatus
}
然而,这确实使得使用从列表中拉出的
shops
变得很困难,因为Typescript将
ShopStatus
类型视为不保证具有任何属性的类型,因此不允许您遵从
挂起的
完成的


为了找回那种能力,您需要在
商店
类型上使用其他内容,以允许Typescript将类型推断缩小到特定的类型版本。

如果您想要阻止商店在没有
挂起
完成
的情况下不会出现的场景,则需要对您的类型更加明确。例如,您可以执行以下操作:

type Status = "PENDING" | "FULFILLED";

interface ShopList {
    [shop: string]: {
        [status in Status]: number[];
    }
}
type ShopWithPending = {
    PENDING: number[];
}

type ShopWithFulfilled = {
    FULFILLED: number[];
}

type ShopStatus = ShopWithPending | ShopWithFulfilled | (ShopWithPending & ShopWithFulfilled);

interface ShopList {
    [shop: string]: ShopStatus
}
然而,这确实使得使用从列表中拉出的
shops
变得很困难,因为Typescript将
ShopStatus
类型视为不保证具有任何属性的类型,因此不允许您遵从
挂起的
完成的


为了恢复这种能力,您需要在
商店
类型上使用其他东西,以允许Typescript将类型推断缩小到特定的类型版本。

谢谢!它的信息量很大。我只是修改了这个问题,添加了关于我想使用字符串枚举的更多细节(我最初可能应该包括它):它在其他地方用作字段值。当有9个选项时,这个解决方案看起来很难扩展?谢谢!它的信息量很大。我只是修改了这个问题,添加了关于我想使用字符串枚举的更多细节(我最初可能应该包括它):它在其他地方用作字段值。当有9个选项时,这个解决方案看起来很难扩展?