TypeScript是JavaScript的超集,它添加了类型系统和其他功能,使开发大型应用程序更加容易和安全。本文将全面介绍TypeScript的核心语法和基本概念,帮助你快速掌握这一强大的编程语言。
1. 什么是TypeScript?
TypeScript是由Microsoft开发和维护的开源编程语言,它是JavaScript的超集,添加了静态类型定义和其他高级特性。TypeScript代码最终会被编译成纯JavaScript代码,可以在任何支持JavaScript的环境中运行。
TypeScript的主要优势
- 静态类型检查:在编译时捕获错误,而不是在运行时
- 更好的IDE支持:提供智能代码补全、导航和重构工具
- 增强的代码可读性和可维护性:类型注解作为文档,使代码意图更清晰
- 支持最新的ECMAScript特性:可以使用最新的JavaScript功能,同时保持对旧浏览器的兼容性
- 面向对 象编程支持:提供类、接口、模块等面向对象编程特性
2. 安装和配置TypeScript
安装TypeScript
使用npm(Node Package Manager)安装TypeScript:
# 全局安装
npm install -g typescript
# 查看安装的版本
tsc --version
创建TypeScript配置文件
在项目根目录创建tsconfig.json
文件,定义TypeScript编译选项:
# 自动生成tsconfig.json文件
tsc --init
一个基本的tsconfig.json
配置示例:
{
"compilerOptions": {
"target": "es6", // 编译目标ES版本
"module": "commonjs", // 模块系统
"strict": true, // 启用所有严格类型检查选项
"esModuleInterop": true, // 启用CommonJS和ES模块之间的互操作性
"skipLibCheck": true, // 跳过声明文件的类型检查
"forceConsistentCasingInFileNames": true, // 强制文件名大小写一致
"outDir": "./dist" // 输出目录
},
"include": ["src/**/*"], // 要编译的文件
"exclude": ["node_modules"] // 要排除的文件
}
编译TypeScript文件
# 编译单个文件
tsc filename.ts
# 使用配置文件编译整个项目
tsc
# 监视模式(自动重新编译)
tsc --watch
3. 基本类型和类型注解
TypeScript提供了丰富的类型系统,可以通过类型注解(: type
)明确变量的类型。
基本类型
// 基本类型
let isDone: boolean = false; // 布尔值
let decimal: number = 6; // 数字
let color: string = "blue"; // 字符串
let list: number[] = [1, 2, 3]; // 数组
let tuple: [string, number] = ["hello", 10]; // 元组
let u: undefined = undefined; // undefined
let n: null = null; // null
// 枚举
enum Color {Red, Green, Blue}
let c: Color = Color.Green; // 1
// any类型(任意类型,相当于关闭类型检查)
let notSure: any = 4;
notSure = "maybe a string";
notSure = false;
// void类型(通常用于函数返回值)
function warnUser(): void {
console.log("This is a warning message");
}
// never类型(永不返回的函数)
function error(message: string): never {
throw new Error(message);
}
// object类型
let obj: object = {name: "John"};
类型推断
TypeScript可以根据变量的初始值自动推断其类型:
// 类型推断
let x = 3; // 推断为number
let y = "hello"; // 推断为string
let z = true; // 推断为boolean
// 数组推断
let arr = [1, 2, 3]; // 推断为number[]
联合类型
联合类型表示一个值可以是多种类型之一:
// 联合类型
let id: string | number;
id = 101; // 有效
id = "202"; // 有效
// id = true; // 错误:类型不匹配
// 使用类型守卫处理联合类型
function printId(id: string | number) {
if (typeof id === "string") {
// 在这个块中,id的类型是string
console.log(id.toUpperCase());
} else {
// 在这个块中,id的类型是number
console.log(id.toFixed(2));
}
}
类型别名
类型别名用于为类型创建新名称:
// 类型别名
type Point = {
x: number;
y: number;
};
let p1: Point = { x: 10, y: 20 };
// 联合类型别名
type ID = string | number;
let userId: ID = 123;
4. 接口
接口是TypeScript的核心特性之一,用于定义对象的结构和契约。
基本接口
// 定义接口
interface User {
id: number;
name: string;
email: string;
age?: number; // 可选属性
readonly createdAt: Date; // 只读属性
}
// 使用接口
const user: User = {
id: 1,
name: "John Doe",
email: "john@example.com",
createdAt: new Date()
};
// user.createdAt = new Date(); // 错误:不能修改只读属性
函数接口
// 函数接口
interface SearchFunc {
(source: string, subString: string): boolean;
}
// 实现函数接口
const mySearch: SearchFunc = function(src, sub) {
return src.search(sub) > -1;
};
类实现接口
// 类实现接口
interface ClockInterface {
currentTime: Date;
setTime(d: Date): void;
}
class Clock implements ClockInterface {
currentTime: Date = new Date();
setTime(d: Date): void {
this.currentTime = d;
}
constructor(h: number, m: number) {}
}
接口继承
// 接口继承
interface Shape {
color: string;
}
interface Square extends Shape {
sideLength: number;
}
const square: Square = {
color: "blue",
sideLength: 10
};
索引签名
// 索引签名
interface StringArray {
[index: number]: string;
}
const myArray: StringArray = ["Bob", "Fred"];
const myStr: string = myArray[0]; // "Bob"
// 字典模式
interface Dictionary {
[key: string]: any;
}
const dict: Dictionary = {
name: "John",
age: 30,
isActive: true
};
5. 函数
TypeScript为函数提供了类型注解,使函数的输入和输出更加明确。
函数类型
// 函数类型
function add(x: number, y: number): number {
return x + y;
}
// 函数表达式
const multiply: (x: number, y: number) => number = function(x, y) {
return x * y;
};
// 箭头函数
const divide = (x: number, y: number): number => x / y;
可选参数和默认参数
// 可选参数
function buildName(firstName: string, lastName?: string): string {
if (lastName) {
return `${firstName} ${lastName}`;
}
return firstName;
}
// 默认参数
function greet(name: string, greeting: string = "Hello"): string {
return `${greeting}, ${name}!`;
}
console.log(greet("John")); // "Hello, John!"
console.log(greet("Jane", "Hi")); // "Hi, Jane!"
剩余参数
// 剩余参数
function sum(...numbers: number[]): number {
return numbers.reduce((total, n) => total + n, 0);
}
console.log(sum(1, 2, 3, 4)); // 10
函数重载
// 函数重载
function convertToNumber(value: string): number;
function convertToNumber(value: boolean): number;
function convertToNumber(value: string | boolean): number {
if (typeof value === "string") {
return value.length;
}
return value ? 1 : 0;
}
const len = convertToNumber("hello"); // 5
const bool = convertToNumber(true); // 1