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

如何在TypeScript声明文件中声明支持DIRECTION类型索引的MOVE_COST?

解决方法

首先,你遇到的问题根源在于TypeScript对索引签名的限制(仅允许string/number/symbol类型),以及你定义的空接口DIRECTION无法被识别为数字类型的子类型。要同时满足类型安全(仅允许方向常量索引)和符合TS索引规则,可以使用**品牌化数字类型(Branded Number Type)**来实现:

// 定义品牌化的DIRECTION类型,既是number又带有独特标识
type DIRECTION = number & { __brand: 'direction' };

// 声明所有方向常量为DIRECTION类型
declare const TOP: DIRECTION;
declare const TOP_RIGHT: DIRECTION;
declare const RIGHT: DIRECTION;
declare const BOTTOM_RIGHT: DIRECTION;
declare const BOTTOM: DIRECTION;
declare const BOTTOM_LEFT: DIRECTION;
declare const LEFT: DIRECTION;
declare const TOP_LEFT: DIRECTION;

// 使用Record<K, V>定义MOVE_COST,键为DIRECTION类型
declare const MOVE_COST: Record<DIRECTION, number>;

为什么这样有效?

  1. 解决索引签名错误:DIRECTION是number的子类型(通过交叉类型number & { __brand: 'direction' }实现),因此Record<DIRECTION, number>会被TS识别为合法的数字索引类型,不会再抛出TS1023错误。
  2. 类型敏感性实现:品牌化的类型确保只有被声明为DIRECTION的常量(如TOP、BOTTOM)才能用来索引MOVE_COST。普通数字(如3)因为没有__brand标识,无法被赋值给DIRECTION类型,因此会触发TS错误,完全符合你的预期。

额外可选方案

如果你知道每个方向常量的具体数值(比如TOP = 0、RIGHT = 2),也可以用数字字面量联合类型实现更精确的类型控制:

// 声明每个方向为具体的数字字面量类型
declare const TOP: 0;
declare const TOP_RIGHT: 1;
declare const RIGHT: 2;
declare const BOTTOM_RIGHT: 3;
declare const BOTTOM: 4;
declare const BOTTOM_LEFT: 5;
declare const LEFT: 6;
declare const TOP_LEFT: 7;

// 定义DIRECTION为这些字面量的联合类型
type DIRECTION = typeof TOP | typeof TOP_RIGHT | typeof RIGHT | typeof BOTTOM_RIGHT | typeof BOTTOM | typeof BOTTOM_LEFT | typeof LEFT | typeof TOP_LEFT;

// 同样使用Record定义MOVE_COST
declare const MOVE_COST: Record<DIRECTION, number>;

这种方式的区别是:如果用户输入了与常量数值完全匹配的数字(比如3对应BOTTOM_RIGHT),TS会允许访问;而品牌化类型则完全禁止使用数字字面量访问,只能用常量名。你可以根据自己的需求选择合适的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:27:58