1. 基本类型

1.1 数字类型 (number)

在 TypeScript 中,number 类型代表数字值,支持整数和浮点数。

let age: number = 25;
let price: number = 99.99;

1.2 字符串类型 (string)

string 类型用于表示文本数据,所有的字符串必须用单引号 (') 或双引号 (") 括起来。

let name: string = "白白的白豆腐";
let message: string = `你好, ${name}!`;

1.3 布尔类型 (boolean)

boolean 类型用于表示逻辑值,只有两个可能的值:true 或 false。

let isActive: boolean = true;
let isCompleted: boolean = false;

1.4 数组类型 (array)

数组是存储多个值的容器,可以定义数组的类型。

let numbers: number[] = [1, 2, 3];
let names: string[] = ["Tom", "Jerry"];

2. 函数类型

2.1 基本函数定义

TypeScript 中函数的类型定义可以通过 function 关键字来指定参数类型和返回值类型。

function greet(name: string): string {
  return `Hello, ${name}`;
}

2.2 可选参数

在函数定义中,某些参数是可选的,可以通过在参数名后加上 ? 来表示。

function greet(name: string, age?: number): string {
  if (age) {
    return `Hello, ${name}. You are ${age} years old.`;
  }
  return `Hello, ${name}`;
}

2.3 默认参数值

可以为函数参数设置默认值,当没有传入参数时使用默认值。

function greet(name: string, age: number = 18): string {
  return `Hello, ${name}. You are ${age} years old.`;
}

3. 对象类型

3.1 对象类型定义

对象类型的定义可以通过接口(interface)或者类型别名(type)来表示。

interface Person {
  name: string;
  age: number;
}

let person: Person = { name: "Tom", age: 30 };

3.2 可选属性

接口中的某些属性可以是可选的,通过在属性名后添加 ? 来表示。

interface Person {
  name: string;
  age?: number;
}

let person: Person = { name: "Tom" }; // age 是可选的

3.3 任意属性

如果对象的属性是动态的,或者不确定的,可以使用 index signature 来表示。

interface Dictionary {
  [key: string]: string;
}

let dict: Dictionary = { name: "Tom", city: "Shanghai" };

4. 类型推断与类型注解

4.1 类型推断

TypeScript 会根据变量的赋值自动推断出类型。例如,当你给变量赋值时,TypeScript 会根据值的类型推断出该变量的类型。

let age = 25; // TypeScript 自动推断 age 的类型为 number

4.2 类型注解

类型注解是显式地指定变量的类型。即使 TypeScript 能自动推断类型,仍然可以使用类型注解来显式指定变量的类型。

let age: number = 25;

5. 联合类型与交叉类型

5.1 联合类型(Union Type)

联合类型允许一个变量可以是多种类型中的一种,用竖线 (|) 来分隔。

let value: string | number;
value = "hello";
value = 123;

5.2 交叉类型(Intersection Type)

交叉类型表示一个变量可以同时具有多个类型,使用 & 连接多个类型。

interface A {
  name: string;
}

interface B {
  age: number;
}

let person: A & B = { name: "Tom", age: 30 };

6. 类与对象

6.1 类定义

TypeScript 中的类和 JavaScript 类类似,可以通过 class 关键字来定义。

class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet(): string {
    return `Hello, ${this.name}`;
  }
}

let person = new Person("Tom", 30);
console.log(person.greet());

6.2 继承与多态

TypeScript 支持类的继承,可以使用 extends 关键字来继承父类。

class Employee extends Person {
  job: string;

  constructor(name: string, age: number, job: string) {
    super(name, age);
    this.job = job;
  }

  greet(): string {
    return `Hello, ${this.name}. Your job is ${this.job}.`;
  }
}

let employee = new Employee("Tom", 30, "Engineer");
console.log(employee.greet());

7. 泛型(Generics)

7.1 泛型函数

泛型使得函数可以接受多种类型的参数,并保持类型一致性。

function identity<T>(arg: T): T {
  return arg;
}

let result = identity("Hello"); // result 的类型为 string

7.2 泛型约束

泛型可以添加约束,确保传入的类型满足一定条件。

function getLength<T extends { length: number }>(arg: T): number {
  return arg.length;
}

console.log(getLength("Hello")); // 输出 5

8. 高级类型

8.1 映射类型(Mapped Types)

映射类型可以根据已有类型创建新类型,通过修改类型的属性来实现。

type ReadOnly<T> = {
  readonly [P in keyof T]: T[P];
};

interface Person {
  name: string;
  age: number;
}

const person: ReadOnly<Person> = { name: "Tom", age: 30 };
// person.name = "Jerry"; // 错误,属性为只读

8.2 条件类型(Conditional Types)

条件类型允许根据类型的不同选择不同的类型。

type IsString<T> = T extends string ? "yes" : "no";

type Test1 = IsString<string>; // "yes"
type Test2 = IsString<number>; // "no"

不焦虑 ,不抱怨,向前走 ,向前看 ,生活 就这 么简单