一、TypeScript 是什么
TypeScript 是一种由微软开发的开源编程语言,它在 JavaScript 的基础上添加了静态类型检查。这意味着我们可以在编写代码时指定变量、函数参数、函数返回值等的类型,编译器会在编译阶段对代码进行类型检查,提前发现潜在的类型错误,而不是像 JavaScript 那样在运行时才暴露问题。
例如,在 JavaScript 中我们可以这样写代码:
let num = 5;
num = "hello"; // 这样的赋值在 JavaScript 中是合法的,但可能会导致意外的行为
而在 TypeScript 中,我们可以明确指定 num
的类型为 number
,这样上述错误的赋值在编译阶段就会被捕获:
let num: number = 5;
num = "hello"; // 编译错误:不能将类型 "string" 分配给类型 "number"
二、环境搭建
要开始使用 TypeScript,首先需要安装 Node.js,因为 TypeScript 编译器 tsc
是基于 Node.js 运行的。
安装完成 Node.js 后,通过命令行使用 npm
(Node 包管理器)全局安装 TypeScript:
npm install -g typescript
安装成功后,就可以在命令行中使用 tsc
命令来编译 TypeScript 文件了。
三、基本数据类型
TypeScript 包含了 JavaScript 的所有基本数据类型,并为它们添加了类型标注。
- 数字类型(number):包括整数和浮点数。
let age: number = 25;
let price: number = 9.99;
- 字符串类型(string):用单引号或双引号括起来的字符序列。
let name: string = "John";
let message: string = 'Hello, World!';
- 布尔类型(boolean):只有
true
和false
两个值。
let isActive: boolean = true;
let isCompleted: boolean = false;
- 数组类型(Array):可以指定数组中元素的类型。
let numbers: number[] = [1, 2, 3, 4, 5];
let names: string[] = ["Alice", "Bob", "Charlie"];
也可以使用泛型数组类型 Array<>
:
let fruits: Array<string> = ["apple", "banana", "cherry"];
- 元组类型(Tuple):表示已知元素数量和类型的数组,每个位置的元素类型是固定的。
let person: [string, number] = ["Tom", 30];
- 枚举类型(Enum):用于定义一组命名常量。
enum Color {Red,Green,Blue
}
let myColor: Color = Color.Green;
- 任意类型(any):当我们不确定某个变量的类型或者希望它可以是任意类型时,可以使用
any
。但应尽量避免过度使用,因为这会削弱 TypeScript 的类型检查优势。
let something: any = "Hello";
something = 123;
四、变量声明
在 TypeScript 中,使用 let
和 const
来声明变量,与 JavaScript 类似,但具有类型推断和更严格的作用域规则。
let
声明:变量可以重新赋值,但具有块级作用域。
let x: number = 10;
x = 20; // 合法
const
声明:变量一旦赋值就不能再重新赋值,也具有块级作用域,常用于声明常量。
const PI: number = 3.14159;
// PI = 3.14; // 编译错误:无法为 "PI" 赋值,因为它是常量
五、函数
TypeScript 中的函数可以指定参数类型和返回值类型。
- 普通函数:
function add(a: number, b: number): number {return a + b;
}
let result: number = add(5, 3);
- 箭头函数:
let multiply = (a: number, b: number): number => a * b;
- 可选参数:函数参数可以标记为可选的,使用
?
符号。
function greet(name?: string): void {if (name) {console.log(`Hello, ${name}!`);} else {console.log("Hello, stranger!");}
}
greet(); // 输出:Hello, stranger!
greet("John"); // 输出:Hello, John!
- 默认参数:可以为函数参数指定默认值。
function power(base: number, exponent: number = 2): number {return Math.pow(base, exponent);
}
console.log(power(3)); // 输出:9
六、接口
接口用于定义对象的形状,描述对象应该具有哪些属性和方法。
interface Person {name: string;age: number;sayHello(): void;
}let john: Person = {name: "John",age: 35,sayHello() {console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);}
};
接口可以继承其他接口,实现代码的复用和扩展:
interface Employee extends Person {jobTitle: string;
}let jane: Employee = {name: "Jane",age: 28,jobTitle: "Developer",sayHello() {console.log(`Hi, I'm ${this.name}, a ${this.jobTitle}.`);}
};
七、类
TypeScript 支持面向对象编程的类和继承。
- 类的定义:
class Animal {name: string;constructor(name: string) {this.name = name;}makeSound(): void {console.log("Some generic animal sound");}
}
- 类的继承:
class Dog extends Animal {constructor(name: string) {super(name);}makeSound(): void {console.log("Woof! Woof!");}
}let myDog: Dog = new Dog("Buddy");
myDog.makeSound(); // 输出:Woof! Woof!
类中还可以包含访问修饰符,如 public
(默认,可在任何地方访问)、private
(只能在类内部访问)和 protected
(在类内部和子类中可访问),用于控制成员的访问权限。
八、模块
TypeScript 支持模块化编程,有助于组织和管理代码。
例如,我们可以创建一个名为 math.ts
的模块:
export function add(a: number, b: number): number {return a + b;
}export function subtract(a: number, b: number): number {return a - b;
}
在其他文件中,可以导入并使用这个模块:
import { add, subtract } from './math';console.log(add(5, 3)); // 输出:8
console.log(subtract(10, 4)); // 输出:6