如何约束状态机泛型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
相关产品推荐
相关产品推荐

