使用 let 声明变量
// 基础变量声明 let playerName: string = "玩家1"; // 声明字符串变量 let goldCount: number = 100; // 声明数字变量 let isHeroAlive: boolean = true; // 声明布尔变量 // 魔兽相关变量声明 let myHero: unit; // 声明单位变量 let currentPlayer: player; // 声明玩家变量 let weapon: item; // 声明物品变量 // 不指定初始值的变量声明 let damage: number; // 稍后会赋值的伤害值 let targetUnit: unit; // 稍后会赋值的目标单位
使用 const 声明常量
// 基础常量声明 const MAX_LEVEL: number = 25; // 最大等级 const GAME_VERSION: string = "1.0.0"; // 游戏版本号 // 魔兽相关常量声明 const HERO_INIT_X: number = 0; // 英雄初始X坐标 const HERO_INIT_Y: number = 0; // 英雄初始Y坐标 // 从项目中实际的例子: const ORIGIN_FRAME_GAME_UI: number; // 游戏UI框架常量 const FRAMEEVENT_CONTROL_CLICK: number; // 框架点击事件常量
数组变量声明
// 简单数组 let heroList: unit[] = []; // 英雄单位数组 let itemArray: item[] = []; // 物品数组 let damageValues: number[] = [100, 200, 300]; // 伤害值数组 // 从项目中的实际例子: let idAndNum: string[]; // 用于存储ID和数量的数组
对象变量声明
// 从项目中的对象类型声明 let unitConfig: uobj = { Art: "units/human/footman/footman.mdl", Name: "步兵", HP: "100", spd: "270", armor: "2" }; let itemConfig: iobj = { Art: "ReplaceableTextures/CommandButtons/BTNSteelMelee", Name: "铁剑", goldcost: "500", Description: "基础武器" };
类型推断的变量声明
// TypeScript 可以自动推断类型 let gold = 100; // 自动推断为 number let name = "圣骑士"; // 自动推断为 string let alive = true; // 自动推断为 boolean
复杂类型的变量声明
// 函数类型变量 let damageCallback: (source: unit, target: unit) => number; // 对象类型变量 let playerData: { name: string; hero: unit; level: number; items: item[]; }; // 从项目中的实际例子: let frameEventCallback: () => void; // UI框架事件回调
特殊变量声明
// 可选属性 let heroStats: { strength: number; agility: number; intelligence: number; armor?: number; // 可选的护甲属性 }; // 联合类型 let resourceType: "gold" | "lumber"; // 只能是这两个字符串之一 let value: number | string; // 可以是数字或字符串
全局变量声明
// 在类型定义文件中声明全局变量 declare let isDebug: boolean; // 全局调试标志 declare let tempGroup: group; // 全局临时单位组
使用变量的一些最佳实践:
选择合适的声明方式
// 对于不会改变的值使用 const const MAX_PLAYERS: number = 12; // 对于会改变的值使用 let let currentGold: number = 0;
明确的类型声明
// 虽然可以类型推断,但在重要变量上最好明确声明类型 let mainHero: unit; let playerGold: number = 0;
有意义的变量名
// 好的命名 let heroAttackDamage: number = 50; let isPlayerAlive: boolean = true; // 避免这样的命名 let x: number = 50; let flag: boolean = true;
这些是在魔兽地图开发中最常用的变量声明方式。
let
和 const
的主要区别:
可变性区别
// let 声明的变量可以重新赋值 let heroGold: number = 100; heroGold = 200; // ✅ 正确,可以修改 heroGold = heroGold + 50; // ✅ 正确,可以修改 // const 声明的常量不能重新赋值 const MAX_GOLD: number = 1000000; MAX_GOLD = 2000000; // ❌ 错误!常量不能重新赋值 MAX_GOLD = MAX_GOLD + 100; // ❌ 错误!常量不能重新赋值
初始化要求
// let 可以先声明后赋值 let playerHero: unit; playerHero = CreateUnit(...); // ✅ 正确,可以后续赋值 // const 必须在声明时就初始化 const playerHero: unit; // ❌ 错误!const声明必须初始化 const MAX_LEVEL: number = 25; // ✅ 正确,声明时就赋值
对象属性的修改
// 使用 let 声明的对象 let hero = { name: "圣骑士", level: 1, gold: 100 }; hero.level = 2; // ✅ 正确,可以修改对象的属性 hero = { // ✅ 正确,可以重新赋值整个对象 name: "法师", level: 1, gold: 100 }; // 使用 const 声明的对象 const HERO_INIT = { name: "圣骑士", level: 1, gold: 100 }; HERO_INIT.level = 2; // ✅ 正确,可以修改对象的属性 HERO_INIT = { // ❌ 错误!不能重新赋值整个对象 name: "法师", level: 1, gold: 100 };
使用场景
// let 适用于需要改变的值 let currentGold: number = 0; // 玩家当前金币 let heroLevel: number = 1; // 英雄当前等级 let isAlive: boolean = true; // 单位存活状态 // const 适用于固定不变的值 const GOLD_BOUNTY: number = 50; // 击杀奖励金币 const HERO_INIT_X: number = -500; // 英雄出生点X坐标 const GAME_VERSION: string = "1.0"; // 游戏版本号
在循环中的使用
// let 可以在循环中使用 for(let i = 0; i < 5; i++) { let unit = CreateUnit(...); } // const 不适合在循环中作为计数器 for(const i = 0; i < 5; i++) { // ❌ 错误!i不能递增 const unit = CreateUnit(...); }
最佳实践建议
// 1. 优先使用 const const TRIGGER_REGION = CreateRegion(); // 固定的触发区域 const MAX_INVENTORY = 6; // 物品栏大小上限 // 2. 需要修改时才使用 let let playerGold = 0; // 会变化的玩家金币 let heroLevel = 1; // 会升级的英雄等级 // 3. 对于配置类数据使用 const const GAME_CONFIG = { startingGold: 100, maxLevel: 25, respawnTime: 60 };
总结:
let
用于声明可能会改变的变量const
用于声明不会改变的常量const
声明的对象虽然不能重新赋值,但其属性可以修改- 建议优先使用
const
,只有在需要修改变量值的时候才使用let
这样的区分可以:
- 提高代码的可读性
- 防止意外修改重要数值
- 帮助其他开发者理解代码意图
- 有利于代码维护和调试