TypeScript是由微软开发的开源编程语言,是JavaScript的超集,为JavaScript添加了静态类型系统。它具有以下特点:
TypeScript代码需要经过编译才能运行在浏览器或Node.js环境中:
TypeScript源码 (.ts) → TypeScript编译器 (tsc) → JavaScript代码 (.js) → 运行时环境
编译过程会进行类型检查,如果发现类型错误,编译将失败,但可以配置为即使有错误也生成JavaScript代码。
TypeScript是JavaScript的超集,这意味着:
Node.js是运行TypeScript编译器的必要环境:
# 检查Node.js版本
node --version
# 检查npm版本
npm --version
使用npm全局安装TypeScript编译器:
# 全局安装TypeScript
npm install -g typescript
# 验证安装
tsc --version
对于实际项目,建议在项目中本地安装TypeScript:
# 初始化项目
npm init -y
# 本地安装TypeScript
npm install --save-dev typescript
# 使用npx运行本地安装的编译器
npx tsc --version
推荐使用以下开发工具获得最佳TypeScript开发体验:
创建一个名为 hello.ts 的文件,并输入以下代码:
// hello.ts - 第一个TypeScript程序
// 使用类型注解声明变量
let message: string = "Hello, TypeScript!";
// 输出消息到控制台
console.log(message);
// 尝试一个简单的计算
let number1: number = 10;
let number2: number = 20;
let sum: number = number1 + number2;
console.log(`The sum of ${number1} and ${number2} is ${sum}`);
let message: string - 声明一个字符串类型的变量: string - 类型注解,告诉TypeScript变量的类型console.log() - 输出信息到控制台在命令行中执行以下命令:
# 编译TypeScript文件
tsc hello.ts
# 查看生成的JavaScript文件
cat hello.js
# 运行生成的JavaScript文件
node hello.js
编译后的 hello.js 文件内容:
// hello.js - 编译后的JavaScript代码
var message = "Hello, TypeScript!";
console.log(message);
var number1 = 10;
var number2 = 20;
var sum = number1 + number2;
console.log("The sum of ".concat(number1, " and ").concat(number2, " is ").concat(sum));
let 被转换为 var(取决于target配置)创建 tsconfig.json 文件来配置TypeScript编译器的行为:
{
"compilerOptions": {
// 编译目标版本
"target": "ES6",
// 模块系统
"module": "commonjs",
// 输出目录
"outDir": "./dist",
// 源码目录
"rootDir": "./src",
// 严格模式(推荐开启)
"strict": true,
// ES模块互操作
"esModuleInterop": true,
// 允许导入JSON模块
"resolveJsonModule": true,
// 生成源映射文件
"sourceMap": true,
// 移除注释
"removeComments": false,
// 启用装饰器支持
"experimentalDecorators": true
},
// 包含的文件
"include": [
"src/**/*"
],
// 排除的文件
"exclude": [
"node_modules",
"dist"
]
}
target:指定编译后的JavaScript版本(ES3, ES5, ES6/ES2015, ES2016等)module:指定模块系统(commonjs, amd, system, umd, es2015, esnext等)strict:启用所有严格类型检查选项outDir 和 rootDir:组织项目结构推荐的项目目录结构:
my-typescript-project/
├── src/ # TypeScript源码目录
│ ├── index.ts
│ ├── utils/
│ │ └── helper.ts
│ └── types/
│ └── user.ts
├── dist/ # 编译输出目录
├── node_modules/
├── tsconfig.json # TypeScript配置
└── package.json
使用配置文件编译项目:
# 编译整个项目(使用tsconfig.json)
tsc
# 监听模式(文件变化时自动编译)
tsc --watch
# 增量编译(只编译有变化的文件)
tsc --incremental
# 强制重新编译
tsc --force
# 显示编译详细信息
tsc --verbose
在package.json中添加编译脚本:
{
"scripts": {
"build": "tsc",
"build:watch": "tsc --watch",
"dev": "tsc && node dist/index.js"
}
}
JavaScript是动态类型语言,TypeScript是静态类型语言:
// JavaScript - 动态类型
function add(a, b) {
return a + b;
}
// 运行时才会发现错误
add(1, "2"); // "12" - 运行时错误
add(1, 2); // 3 - 正常
// TypeScript - 静态类型
function add(a: number, b: number): number {
return a + b;
}
// 编译时就会报错
add(1, "2"); // 编译错误:类型不匹配
add(1, 2); // 3 - 正常
// JavaScript
const user = {
name: "Alice",
age: 25
};
// 可以随意添加属性
user.email = "alice@example.com"; // 运行时没问题
// TypeScript
interface User {
name: string;
age: number;
}
const user: User = {
name: "Alice",
age: 25
};
// 编译错误:属性不存在
user.email = "alice@example.com"; // 编译时报错
// JavaScript
function processUser(user) {
console.log(user.name.toUpperCase());
}
// 运行时可能出错
processUser(null); // TypeError: Cannot read property 'name' of null
// TypeScript
function processUser(user: { name: string }) {
console.log(user.name.toUpperCase());
}
// 编译时错误
processUser(null); // 编译错误:参数不能为null
// JavaScript
const numbers = [1, 2, 3];
numbers.push("4"); // 运行时没问题,但类型混乱
// TypeScript
const numbers: number[] = [1, 2, 3];
numbers.push("4"); // 编译错误:类型不匹配
tsc --version创建 src/index.ts 文件,实现以下功能:
// 定义一个用户接口
interface User {
name: string;
age: number;
email?: string; // 可选属性
}
// 创建用户对象
const user: User = {
name: "张三",
age: 25,
email: "zhangsan@example.com"
};
// 定义问候函数
function greet(user: User): string {
return `你好,${user.name}!你今年${user.age}岁。`;
}
// 调用函数并输出结果
console.log(greet(user));
// 尝试创建一个没有email的用户
const user2: User = {
name: "李四",
age: 30
};
console.log(greet(user2));
tsconfig.json 文件src,输出目录为 dist故意在代码中引入类型错误,观察编译器的错误提示:
// 尝试给user添加不存在的属性
user.phone = "123456789"; // 应该报错
// 尝试传递错误类型的参数
greet("字符串"); // 应该报错
src 目录下创建子目录:types, utilssrc/types/user.tssrc/utils/greeting.ts在本课中,我们学习了:
tsconfig.json 文件控制编译行为