TypeScript 变量定义
在 TypeScript 中,变量是用来存储数据的容器。你可以使用 var
、let
或 const
来声明变量,但它们的行为略有不同。本节将带你了解如何在 TypeScript 中声明变量、作用域的区别、变量类型、类型断言、类型推断等内容。
变量的命名规则
变量是程序中用于存储值的命名内存空间。在 TypeScript 中,变量必须遵循 JavaScript 的命名规则:
- 变量名可以包含字母和数字。
- 不能包含空格和特殊字符(下划线
_
和美元符号$
除外)。 - 不能以数字开头。
变量的声明方式
TypeScript 是强类型语言,你可以在声明变量时指定类型。TypeScript 中声明变量的语法是在变量名后加冒号 :
,然后指定其类型。以下是四种声明变量的方式:
-
同时声明类型和值
// 格式
var [identifier] : [type-annotation] = value ;
// 示例
var name: string = "Mary"; -
声明类型但不赋值(此时变量默认值为
undefined
)// 格式
var [identifier] : [type-annotation] ;
// 示例
var name: string; -
赋值但不声明类型(类型将根据赋值推断)
// 格式
var [identifier] = value ;
// 示例
var name = "Mary"; -
既不赋值也不声明类型(此时变量类型为
any
,默认值为undefined
)// 格式
var [identifier] ;
// 示例
var name;
示例:TypeScript 中的变量
var name: string = "John";
var score1: number = 50;
var score2: number = 42.50;
var sum = score1 + score2;
console.log("name: " + name);
console.log("first score: " + score1);
console.log("second score: " + score2);
console.log("sum of the scores: " + sum);
编译后生成的 JavaScript 代码如下:
var name = "John";
var score1 = 50;
var score2 = 42.50;
var sum = score1 + score2;
console.log("name" + name);
console.log("first score: " + score1);
console.log("second score: " + score2);
console.log("sum of the scores: " + sum);
输出结果为:
name: John
first score: 50
second score: 42.50
sum of the scores: 92.50
如果尝试给变量赋不符合其类型定义的值,TypeScript 编译器会报错。例如:
var num: number = "hello"; // 会报编译错误
类型断言
TypeScript 允许将变量从一种类型转换为另一种类型,这个过程称为类型断言(Type Assertion)。语法是将目标类型放在 < >
符号中,并放在变量或表达式前面。
var str = '1';
var str2: number = <number> <any> str; // 将 str 断言为 number 类型
console.log(typeof(str2));
代码解释:
<number>
是类型断言的目标类型,表示你希望将变量str
断言为number
类型。<any>
:any
是 TypeScript 中的一种特殊类型,表示变量可以是任何类型。通过先将变量断言为any
,可以绕过 TypeScript 的类型检查,然后再将其断言为目标类型。
这段代码编译后生成的 JavaScript 代码如下:
"use strict";
var str = '1';
var str2 = str; // str 被断言为 number 类型
console.log(typeof (str2));
输出结果为:
string
类型断言是编译时的构造,不会在运行时提供支持。
类型推断
TypeScript 支持类型推断(Inferred Typing),即在不指定类型的情况下,编译器会根据初始赋值推断变量类型。
var num = 2; // 类型被推断为 number
console.log("value of num: " + num);
num = "12"; // 会报编译错误
console.log(num);
输出错误:
error TS2322: Type 'string' is not assignable to type 'number'.
变量作用域
TypeScript 中变量的作用域(Scope)决定了变量在程序中的可访问性:
- 全局作用域:在程序构造之外声明,可在代码任何位置访问
- 类作用域:在类中但方法外声明,可通过类实例访问
- 局部作用域:在方法、循环等构造内声明,仅在声明的位置可访问
示例:
var global_num = 12; // 全 局变量
class Numbers {
num_val = 13; // 类变量
static sval = 10; // 静态变量
storeNum(): void {
var local_num = 14; // 局部变量
}
}
console.log("Global num: " + global_num);
console.log(Numbers.sval); // 访问静态变量
var obj = new Numbers();
console.log("Global num: " + obj.num_val);
编译后的 JavaScript 代码:
var global_num = 12;
var Numbers = (function () {
function Numbers() {
this.num_val = 13;
}
Numbers.prototype.storeNum = function () {
var local_num = 14;
};
Numbers.sval = 10;
return Numbers;
}());
console.log("Global num: " + global_num);
console.log(Numbers.sval);
var obj = new Numbers();
console.log("Global num: " + obj.num_val);
输出结果:
Global num: 12
10
Global num: 13
如果尝试在方法外访问局部变量,会报编译错误:
error TS2095: Could not find symbol 'local_num'.
小结
本文介绍了 TypeScript 中变量的使用方法,包括变量的声明方式、类型断言、类型推断以及作用域规则。通过 TypeScript 的类型系统,你可以在编译时捕获类型错误,提高代码的健壮性。类型推断功能让你在享受类型安全的同时,保持代码的简洁性。理解变量的作用域规则,能帮助你更好地组织代码结构,避免变量污染和命名冲突。掌握这些基础知识,将为你后续学习更复杂的 TypeScript 概念打下坚实基础。