TypeScript引用其他文件enum作函数参数类型时TS2702错误求助
问题解决:TypeScript枚举作为类静态属性时的类型访问错误
错误原因
你将GameState枚举挂载到了继承自Cocos Creator Component的Constants类静态属性上。在TypeScript中,当你在类型声明位置(比如函数参数类型state: Constants.GameState)使用Constants.GameState时,TypeScript会把Constants识别为类型而非值/命名空间,而类的静态属性无法作为类型的一部分被这样直接访问,因此抛出'Constants' only refers to a type, but is being used as a namespace here错误。
最优解决方案
Constants只是用来集中管理枚举和常量,完全不需要继承Component(Component是Cocos Creator中用于挂载到节点的组件类,纯常量类不需要这个特性),直接导出枚举即可:
修改后的Constants.ts
// Constants.ts // 无需导入Component相关内容 export enum GameState { START_SCREEN = "start_screen", } // 其他全局常量也可以直接导出 export const MAX_SCORE = 9999;
修改后的GameManager.ts
//GameManager.ts import { _decorator, Component, Node, resources, Prefab, view, instantiate, find, director, Vec3, game, sys } from 'cc'; import { GameState } from './Constants'; // 直接导入枚举 const { ccclass, property } = _decorator; @ccclass('GameManager') export class GameManager extends Component { static active_state: GameState; // 明确指定类型 public static set_State(state: GameState): void { GameManager.active_state = state; // 使用枚举值时直接写GameState.START_SCREEN即可 } }
可选方案(保留Constants类)
如果一定要把枚举放在类中管理,不要让Constants继承Component(纯静态类不需要组件特性),同时可以通过两种方式访问类型:
修改后的Constants.ts
// Constants.ts export enum GameState { START_SCREEN = "start_screen", } export class Constants { public static GameState = GameState; // 其他静态常量 }
修改后的GameManager.ts
//GameManager.ts import { _decorator, Component, Node, resources, Prefab, view, instantiate, find, director, Vec3, game, sys } from 'cc'; import { Constants, GameState } from './Constants'; const { ccclass, property } = _decorator; @ccclass('GameManager') export class GameManager extends Component { static active_state: GameState; // 方式1:直接用导入的GameState作为类型 public static set_State(state: GameState): void { GameManager.active_state = state; // 赋值时可以用Constants.GameState.START_SCREEN } // 方式2:不单独导入GameState,通过typeof获取类型 public static set_State2(state: typeof Constants.GameState[keyof typeof Constants.GameState]): void { GameManager.active_state = state; } }
内容的提问来源于stack exchange,提问作者noobsee
相关产品推荐
相关产品推荐

