You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何约束状态机泛型Record的数组值不包含对应键值?

解决方案

要实现“状态机配置中每个键对应的状态数组不能包含该键本身”的约束,需要利用TypeScript的映射类型和Exclude工具类型来关联键与数组元素的类型关系,修改后的StateMachineConfig类型定义如下:

type StateMachineConfig<State extends string> = {
  [S in State]: Exclude<State, S>[];
};

原理说明

  • 映射类型[S in State]会遍历State的每一个成员,为每个状态单独生成对应的属性定义
  • Exclude<State, S>会从State类型中排除当前遍历到的键S,确保数组里只能包含除当前键以外的其他状态
  • 最终每个键对应的数组类型被严格约束为“排除自身后的状态数组”,从类型层面禁止了数组中出现与键相同的状态值

验证示例

合法配置(无类型错误)

enum MyStates {
    State1 = "State 1",
    State2 = "State 2",
    State3 = "State 3"
}

const validConfig: StateMachineConfig<MyStates> = {
    [MyStates.State1]: [MyStates.State2],
    [MyStates.State2]: [MyStates.State3],
    [MyStates.State3]: [MyStates.State1, MyStates.State2]
};

不合法配置(触发类型错误)

const invalidConfig: StateMachineConfig<MyStates> = {
    [MyStates.State1]: [MyStates.State2],
    [MyStates.State2]: [MyStates.State3],
    [MyStates.State3]: [MyStates.State2, MyStates.State3] // 类型错误:MyStates.State3 无法赋值给 Exclude<MyStates, MyStates.State3> 类型
};

内容的提问来源于stack exchange,提问作者sookie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:20:11