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

TypeScript如何从数字索引映射推导滑动方向字面量联合类型?

类型问题解决方案

你当前的问题是显式给regionDirectionMap标注了值为string的类型注解,导致TypeScript将值的类型拓宽为通用字符串,无法保留具体字面量类型。可以按以下方式修改,不需要重复书写方向名称:

推荐方案(TS 4.9+)

使用as const固定字面量类型,同时用satisfies操作符校验映射结构符合要求,既保留原有的类型校验能力,也不会丢失字面量类型:

// 移除原有的显式类型注解,用as const保留字面量,satisfies校验结构符合要求
const regionDirectionMap = {
    0: 'right',
    1: 'top_right',
    2: 'top',
    3: 'top_left',
    4: 'left',
    5: 'bottom_left',
    6: 'bottom',
    7: 'bottom_right',
} as const satisfies { [index: number]: string };

// 可复用推导结果定义原来的RegionIndexToDirectionMap类型
type RegionIndexToDirectionMap = typeof regionDirectionMap;

type ValueOf<T> = T[keyof T];
// 此时SwipeDirection就是所有方向字面量组成的联合类型
export type SwipeDirection = ValueOf<typeof regionDirectionMap>;

低版本TS兼容方案

如果使用的TS版本低于4.9,没有satisfies支持,可以只加as const,单独做一次类型校验即可:

const regionDirectionMap = {
    0: 'right',
    1: 'top_right',
    2: 'top',
    3: 'top_left',
    4: 'left',
    5: 'bottom_left',
    6: 'bottom',
    7: 'bottom_right',
} as const;

// 单独校验映射结构符合要求
const _typeCheck: { [index: number]: string } = regionDirectionMap;

type ValueOf<T> = T[keyof T];
export type SwipeDirection = ValueOf<typeof regionDirectionMap>;

8区域滑动方向最优表示方案

你当前的映射规则已经是通用的最优方案,对齐三角函数计算逻辑,后续做滑动识别时效率最高:

  • 索引0对应右方向(0°),逆时针每增加1个索引对应角度增加45°
  • 角度计算完成后直接对8取模即可得到对应区域索引,不需要额外做映射转换
  • 方向命名和通用交互方向命名完全对齐,没有理解成本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:18:03