目录
一、TypeScript的概述
TypeScript 是一种由微软开发和维护的开源编程语言。它是 JavaScript 的一个带类型系统的超集,编译为普通的 JavaScript,用于开发大型应用程序。TypeScript 为 JavaScript 语言添加了可选的静态类型、类、接口等特性,为大型团队和项目提供了更好的开发体验。
以下是 TypeScript 的关键特性:
1. 静态类型:TypeScript 强制执行静态类型,这有助于在编译时捕捉错误,而不是在运行时,这可以使得调试和维护代码更加容易。
2. 类型注解:开发者为变量、函数参数和返回类型提供类型信息,TypeScript 使用这些信息进行类型检查。
3. 类和模块:TypeScript 支持 ES6 类和模块,这使得代码的组织和可重用性更好。
4. 接口:TypeScript 使用接口来定义对象的结构和函数的形状,从而实现更健壮的 API 和更好的文档。
5. 泛型:TypeScript 支持泛型,允许开发者创建可以与不同类型一起工作的组件,从而提高代码的重用性和类型安全性。
6. 兼容性:TypeScript 旨在与现有的 JavaScript 代码和库兼容,允许开发者在项目中逐步采用 TypeScript。
7. 工具链:TypeScript 拥有丰富的工具链,包括代码检查器、格式化器和包管理器,帮助维护代码质量和促进协作。
二、TypeScript 官网
2.1TypeScript 官网地址
TypeScript中文网 · TypeScript——JavaScript的超集 (tslang.cn)https://www.tslang.cn/
2.2安装TypeScript
npm install -g typescript
三、TypeScript 语法
3.1 基本语法
- - 类型注解
- - 变量声明
- - 函数声明
- - 类声明
- - 接口
- - 泛型
- - 枚举
- - 类型推断
示例:
// 类型注解
let stringVar: string = "Hello, World!";
let numberVar: number = 42;
let boolVar: boolean = true;
// 变量声明
let uninitiatedVar: any; // 没有初始化的变量
uninitiatedVar = "Hello, TypeScript!";
// 函数声明
function add(a: number, b: number): number {
return a + b;
}
// 箭头函数
const subtract = (a: number, b: number): number => {
return a - b;
};
// 类声明
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet(): string {
return "Hello, " + this.greeting;
}
}
// 实例化类
let greeter = new Greeter("TypeScript");
console.log(greeter.greet());
// 接口
interface Person {
name: string;
age: number;
}
// 实现接口
function printPerson(person: Person): void {
console.log(person.name + " is " + person.age + " years old.");
}
// 泛型
function identity<T>(arg: T): T {
return arg;
}
// 枚举
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
// 类型推断
let inferredVar = 42; // 类型为 number
let anotherInferredVar = "This is a string"; // 类型为 string
// 类型守卫
function isString(value: any): value is string {
return typeof value === "string";
}
let str: string | number = "This is a string";
if (isString(str)) {
console.log(str.toUpperCase());
} else {
console.log(str + 10);
}
// 箭头函数使用类型守卫
const toUpperCase = (s: string): string => s.toUpperCase();
// 模块导入
import { Greeter } from './Greeter';
// 使用模块
let greeterFromModule = new Greeter("TypeScript");
console.log(greeterFromModule.greet());
3.2 类型系统
- - number
- - string
- - boolean
- - null 和 undefined
- - 数组和元组
- - 枚举类型
- - 联合类型
- - 交叉类型
- - 类型别名
- - 泛型类型
// 基本类型
let numberVar: number = 42;
let stringVar: string = "Hello, TypeScript!";
let boolVar: boolean = true;
// null 和 undefined
let nullVar: null = null;
let undefinedVar: undefined = undefined;
// 数组和元组
let numberArray: number[] = [1, 2, 3];
let stringArray: string[] = ["Hello", "World"];
// 元组类型
let tupleType: [string, number] = ["Hello", 123];
// 枚举类型
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
// 联合类型
let unionType: string | number = "Hello";
// 交叉类型
interface PartialPerson {
name?: string;
age?: number;
}
let partialPerson: PartialPerson = { name: "Alice" };
// 类型别名
type Point = { x: number; y: number };
let point: Point = { x: 1, y: 2 };
// 泛型类型
function identity<T>(arg: T): T {
return arg;
}
let identityFunction: <T>(arg: T) => T = identity;
// 泛型类
class Box<T> {
private content: T;
constructor(content: T) {
this.content = content;
}
getContent(): T {
return this.content;
}
}
let box = new Box<string>("Hello, World!");
console.log(box.getContent());
// 泛型接口
interface Container<T> {
getContent(): T;
}
class MyArray<T> implements Container<T> {
private data: T[];
constructor(initialData: T[]) {
this.data = initialData;
}
getContent(): T {
return this.data[0];
}
}
let myArray = new MyArray<string>(["Hello", "World"]);
console.log(myArray.getContent());
3.3 语句
- - 条件语句(if, switch)
- - 循环语句(for, while, do-while)
- - 跳转语句(break, continue, return)
- - 声明语句(var, let, const)
- - 空语句(;)
- - 赋值语句
- - 表达式语句
- - 异步语句(async function, await)
示例:
// 条件语句
if (true) {
console.log("条件为真");
} else {
console.log("条件为假");
}
// 使用 switch 语句
switch (true) {
case true:
console.log("条件为真");
break;
case false:
console.log("条件为假");
break;
}
// 循环语句
// for 循环
for (let i = 0; i < 5; i++) {
console.log(i);
}
// while 循环
let i = 0;
while (i < 5) {
console.log(i);
i++;
}
// do-while 循环
i = 0;
do {
console.log(i);
i++;
} while (i < 5);
// 跳转语句
// break 跳出循环
for (let i = 0; i < 10; i++) {
if (i === 5) {
break;
}
console.log(i);
}
// continue 跳过当前循环迭代
for (let i = 0; i < 10; i++) {
if (i === 5) {
continue;
}
console.log(i);
}
// return 退出函数
function myFunction() {
if (true) {
return "Hello, World!";
}
console.log("This line won't be executed");
}
// 声明语句
let varDeclaration: number = 42;
const constDeclaration: string = "Hello";
// 空语句
// 可以用作占位符
;
// 赋值语句
let assignement = 42;
// 表达式语句
console.log("Expression statement: " + (2 + 2));
// 异步语句
// async 函数
async function asyncGreet() {
return "Hello, Async!";
}
// await 表达式
async function fetchData() {
let response = await fetch("https://api.example.com/data");
let data = await response.json();
console.log(data);
}
fetchData();
3.4 函数
- - 函数声明
- - 箭头函数
- - 函数类型
- - 匿名函数
- - 构造函数
- - 函数表达式
- - 箭头函数表达式
示例:
// 函数声明
function add(x: number, y: number): number {
return x + y;
}
// 调用函数
let result = add(1, 2);
console.log(result); // 输出: 3
// 箭头函数
const subtract = (x: number, y: number): number => {
return x - y;
};
// 调用箭头函数
result = subtract(10, 5);
console.log(result); // 输出: 5
// 函数类型
type MyFunction = (x: number, y: number) => number;
// 匿名函数
const myAnonymousFunction: MyFunction = function(x, y) {
return x * y;
};
// 调用匿名函数
result = myAnonymousFunction(2, 3);
console.log(result); // 输出: 6
// 构造函数
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet(): string {
return "Hello, " + this.greeting;
}
}
// 创建构造函数的实例
let greeter = new Greeter("TypeScript");
console.log(greeter.greet()); // 输出: Hello, TypeScript
// 函数表达式
const myFunctionExpression: MyFunction = function(x, y) {
return x + y;
};
// 调用函数表达式
result = myFunctionExpression(4, 5);
console.log(result); // 输出: 9
// 箭头函数表达式
const myArrowFunctionExpression: MyFunction = (x, y) => {
return x - y;
};
// 调用箭头函数表达式
result = myArrowFunctionExpression(10, 2);
console.log(result); // 输出: 8
3.5 类和模块
- - 类声明
- - 构造函数
- - 类继承
- - 模块导入导出
- - 命名空间
示例:
// 类声明
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet(): string {
return "Hello, " + this.greeting;
}
}
// 构造函数
let greeter = new Greeter("TypeScript");
console.log(greeter.greet()); // 输出: Hello, TypeScript
// 类继承
class Greeter2 extends Greeter {
greeting2: string;
constructor(message: string, greeting2: string) {
super(message); // 调用父类的构造函数
this.greeting2 = greeting2;
}
greet2(): string {
return "Hello, " + this.greeting2;
}
}
let greeter2 = new Greeter2("TypeScript", "World");
console.log(greeter2.greet()); // 输出: Hello, TypeScript
console.log(greeter2.greet2()); // 输出: Hello, World
// 模块导入导出
// 定义一个模块
export class Greeter3 {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet(): string {
return "Hello, " + this.greeting;
}
}
// 导入模块
import { Greeter3 } from "./Greeter3"; // 假设Greeter3模块在当前目录下的Greeter3.ts文件中
let greeter3 = new Greeter3("TypeScript");
console.log(greeter3.greet()); // 输出: Hello, TypeScript
// 命名空间
namespace MyNamespace {
export class Greeter4 {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet(): string {
return "Hello, " + this.greeting;
}
}
}
// 导入命名空间
import { Greeter4 } from "./MyNamespace"; // 假设MyNamespace模块在当前目录下的MyNamespace.ts文件中
let greeter4 = new MyNamespace.Greeter4("TypeScript");
console.log(greeter4.greet()); // 输出: Hello, TypeScript
3.6 高级特性
- - 装饰器(Decorators)
- - 代理(Proxies)
- - Reflect API
- - 解构赋值
- - 模板字符串
- - 默认参数
- - 可选链(Optional Chaining)
- - 扩展运算符(Spread Operator)
- - Promise 和 async/await
示例:
// 装饰器(Decorators)
@myDecorator
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet(): string {
return "Hello, " + this.greeting;
}
}
function myDecorator(constructor: Function) {
console.log("Decorator called for " + constructor.name);
}
// 代理(Proxies)
const handler = {
get(target, prop) {
return target[prop] * 2;
}
};
const numberProxy = new Proxy({}, handler);
numberProxy.a = 5;
console.log(numberProxy.a); // 输出: 10
// Reflect API
let obj = { a: 1, b: 2 };
console.log(Reflect.has(obj, "a")); // 输出: true
// 解构赋值
let { a, b } = obj;
console.log(a, b); // 输出: 1 2
// 模板字符串
const name = "TypeScript";
const greeting = `Hello, ${name}!`;
console.log(greeting); // 输出: Hello, TypeScript!
// 默认参数
function greet(name: string, greeting: string = "Hello") {
console.log(greeting, name);
}
greet("TypeScript"); // 输出: Hello TypeScript
// 可选链(Optional Chaining)
const user = {
info: {
name: "TypeScript",
age: 5
}
};
console.log(user.info.name); // 输出: TypeScript
console.log(user?.info?.name); // 输出: TypeScript
// 扩展运算符(Spread Operator)
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];
console.log(arr2); // 输出: [1, 2, 3, 4, 5]
// Promise 和 async/await
async function fetchData() {
let response = await fetch("https://api.example.com/data");
let data = await response.json();
return data;
}
fetchData().then((data) => {
console.log(data);
});
3.7 类型检查
- - 类型断言
- - 类型守卫(type guards)
- - 类型查询(type queries)
- - 索引签名
- - 映射类型
- - 条件类型
示例:
// 类型断言
const myNumber: number = 42;
const myString: string = myNumber.toString(); // 类型断言
// 类型守卫(type guards)
function isString(value: any): value is string {
return typeof value === "string";
}
function printLength(value: any) {
if (isString(value)) {
console.log(value.length);
} else {
console.log("Not a string");
}
}
printLength("Hello"); // 输出: 5
printLength(123); // 输出: Not a string
// 类型查询(type queries)
const myVar: any = "Hello, World!";
const length: number = (myVar as string).length; // 类型查询
// 索引签名
interface StringArray {
[index: number]: string;
}
const myArray: StringArray = ["Hello", "World"];
console.log(myArray[0]); // 输出: Hello
// 映射类型
type MyMapType = {
[key: string]: number;
};
const myMap: MyMapType = {
a: 1,
b: 2
};
// 条件类型
type IfTrue<T, TResult extends true> = T extends true ? TResult : never;
type MyConditionalType = IfTrue<true, string>; // string
type IfFalse<T, TResult extends false> = T extends false ? TResult : never;
type MySecondConditionalType = IfFalse<false, number>; // number