TypeScript 变量声明
在 TypeScript 中,我们使用 let 和 const 关键字来声明变量。这与现代 JavaScript (ES6) 的做法一致。var 关键字虽然仍然可用,但通常不推荐使用,因为它存在一些作用域问题。
1. 使用 let 声明变量
let 用于声明一个块级作用域的局部变量。这意味着变量只在声明它的代码块(例如,if 语句、for 循环或函数体)内有效。
typescript
let count: number = 10;
if (count > 5) {
let message: string = "Count is greater than 5"; // message 只在 if 块内有效
console.log(message);
}
// console.log(message); // Error: Cannot find name 'message'.使用 let 声明的变量,其值可以被修改。
typescript
let age: number = 25;
age = 26; // OK2. 使用 const 声明常量
const 用于声明一个块级作用域的常量。常量在声明时必须被初始化,并且其值一旦被赋值后就不能再改变。
typescript
const pi: number = 3.14159;
// pi = 3.14; // Error: Cannot assign to 'pi' because it is a constant.const 声明指的是变量引用的值不可变。如果常量是一个对象或数组,你不能重新给它赋值,但可以修改对象或数组内部的属性或元素。
typescript
const person = {
name: "Alice",
age: 30
};
// 修改对象的属性是允许的
person.name = "Bob"; // OK
// 但重新赋值整个对象是不允许的
// person = { name: "Charlie", age: 40 }; // Error
const numbers: number[] = [1, 2, 3];
// 修改数组的元素是允许的
numbers.push(4); // OK
// 但重新赋值整个数组是不允许的
// numbers = [5, 6, 7]; // Error3. 类型注解 (Type Annotation)
TypeScript 允许你在声明变量时显式地指定其类型,这称为“类型注解”。语法是在变量名后加上冒号 (:) 和类型名。
typescript
let myName: string = "John Doe";
let myAge: number = 42;
let isStudent: boolean = false;类型注解是可选的。如果你在声明变量的同时进行了初始化,TypeScript 会使用类型推断来自动确定变量的类型。
typescript
let city = "New York"; // TypeScript 推断 city 的类型为 string
let year = 2024; // TypeScript 推断 year 的类型为 number尽管类型推断很方便,但在以下情况下,显式地添加类型注解是很好的实践:
- 当一个变量没有被立即初始化时。
- 当函数返回值的类型不明显时。
- 当你希望代码的意图更加清晰明确时。
变量作用域 (Scope)
作用域决定了代码中哪些区域可以访问一个变量。
- 块级作用域 (Block Scope): 使用
let和const声明的变量具有块级作用域。它们只在最近的包含代码块({...})内有效。 - 函数作用域 (Function Scope): 使用
var声明的变量具有函数作用域。它们在整个函数内部都是可见的,无论在哪个代码块中声明。 - 全局作用域 (Global Scope): 在所有函数和代码块之外声明的变量具有全局作用域,在代码的任何地方都可以访问。
typescript
let globalVar = "I am global";
function myFunction() {
let functionVar = "I am in a function"; // 函数作用域
if (true) {
let blockVar = "I am in a block"; // 块级作用域
console.log(blockVar);
console.log(functionVar);
console.log(globalVar);
}
// console.log(blockVar); // Error: blockVar is not defined here
}
myFunction();