《深入浅出Typescript》-课程知识点总结与分享 | 青训营

85 阅读5分钟

深入浅出 TypeScript:从基础到高级

TypeScript 是一种由微软开发的开源编程语言,它是 JavaScript 的超集,为 JavaScript 添加了静态类型、类、接口等功能。TypeScript 不仅适用于前端开发,还可以用于后端开发,尤其是在大型项目中表现出色。本文将从 TypeScript 的基础类型开始,逐步延伸到高级类型,并涵盖工程实践方面的内容,以深入浅出的方式介绍 TypeScript 的各种姿势。

一、基础类型

在 TypeScript 中,基础类型用于表示变量的数据类型。常见的基础类型包括布尔类型、数字类型、字符串类型、数组类型、元组类型、枚举类型、任意类型、空类型、null 和 undefined。

typescriptCopy code
let isDone: boolean = false;
let age: number = 25;
let name: string = "Alice";
let numbers: number[] = [1, 2, 3];
let person: [string, number] = ["Alice", 25];
enum Color {
    Red,
    Green,
    Blue
}
let bgColor: Color = Color.Blue;
let dynamicValue: any = "Hello, TypeScript!";
function logMessage(message: string): void {
    console.log(message);
}
let emptyValue: null = null;
let notDefined: undefined = undefined;

解释:

  • isDone 变量的类型被指定为布尔类型,它只能存储 truefalse
  • age 变量的类型被指定为数字类型,可以存储整数或浮点数。
  • name 变量的类型被指定为字符串类型,用于存储文本数据。
  • numbers 变量的类型被指定为数字数组,可以存储一组数字。
  • person 变量的类型被指定为元组,它包含两个元素,第一个是字符串,第二个是数字。
  • Color 是一个枚举类型,其中的成员默认从 0 开始依次递增,可以通过枚举成员的名字或值来使用。
  • bgColor 变量的类型为 Color 枚举类型,它被赋值为 Color.Blue
  • dynamicValue 变量的类型被指定为任意类型,可以存储任何类型的值。
  • logMessage 函数的返回类型被指定为 void,表示没有返回值。
  • emptyValue 变量的类型被指定为 null,可以存储 null 值。
  • notDefined 变量的类型被指定为 undefined,可以存储未定义的值。

二、对象类型与接口

对象类型表示一个具有属性和方法的对象,而接口用于定义对象的结构和约束。

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

let person: Person = { name: "Alice", age: 25 };

interface Car {
    brand: string;
    model: string;
    year?: number; // 可选属性
    readonly id: number; // 只读属性
}

function displayCar(car: Car) {
    console.log(`Brand: ${car.brand}, Model: ${car.model}`);
}

displayCar({ brand: "Toyota", model: "Camry", id: 123 });

interface MathFunction {
    (x: number, y: number): number;
}

let add: MathFunction = (a, b) => a + b;

解释:

  • Person 接口定义了一个 name 属性和一个 age 属性,用于描述一个人的基本信息。
  • person 变量的类型被指定为 Person 接口,确保它符合接口的属性定义。
  • Car 接口定义了 brandmodel 属性,以及一个可选属性 year 和一个只读属性 id
  • displayCar 函数接受一个 Car 类型的参数,用于显示汽车的品牌和型号。
  • MathFunction 接口定义了一个函数类型,接受两个参数并返回一个数字。

三、类型断言

类型断言允许您手动指定一个值的类型,即告诉编译器“我知道这个值的类型,并且我有充分的理由”。

typescriptCopy code
let inputValue: any = "Hello, TypeScript!";
let length: number = (inputValue as string).length;

解释:

  • 此处使用类型断言将 inputValue 变量转换为字符串类型,然后获取其长度属性。

四、进阶用法

  1. 类(Class)

    TypeScript 支持类的定义,可以使用面向对象的方式编写代码。

typescriptCopy code
class Person {
    constructor(public name: string, public age: number) {}
    greet() {
        console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
    }
}

let alice = new Person("Alice", 25);
alice.greet();

解释:

  • 此处定义了一个 Person 类,它有一个构造函数,一个 name 属性和一个 age 属性。
  • greet 方法用于在控制台输出问候语,其中使用了类的属性。
  1. 泛型(Generics)

    泛型允许在定义函数、类或接口时使用一个占位符类型,以在使用时指定具体类型。

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

let result: string = identity("Hello, TypeScript!");

解释:

  • identity 函数使用了泛型 T,表示参数和返回值的类型可以是任意类型。
  • 在调用 identity 函数时,我们指定了类型为 string,从而返回一个字符串。

五、工程向内容

  1. 代码检测(Type Checking)

    TypeScript 提供了静态类型检查,可以在编码阶段捕获许多错误。

示例代码:

typescriptCopy code
let age: number = "25"; // 错误,类型不匹配

解释:

  • 在示例代码中,将字符串赋值给 age 变量,导致类型不匹配的错误。
  1. 编译配置(tsconfig.json)

    tsconfig.json 文件用于配置 TypeScript 编译器的行为。

示例代码:

jsonCopy code
{
    "compilerOptions": {
        "target": "ES6",
        "outDir": "./dist"
    }
}

解释:

  • 我们的 tsconfig.json 文件指定了编译目标为 ES6,并设置输出目录为 ./dist
  1. 工程中的最佳实践

    • 使用接口定义复杂的数据结构,增强代码的可读性和维护性。
    • 使用类型别名(type)来简化复杂类型,提高代码清晰度。
    • 使用枚举来表示一组常量,避免硬编码。
    • 使用泛型提高代码的灵活性,避免重复代码。
    • 使用类来组织代码和数据,促进面向对象编程。
    • 使用模块化编程,将代码拆分成模块,提高代码复用性。
    • 遵循一致的命名规范,提高代码的可读性。
  2. 迁移工具

    TypeScript 提供了迁移工具,帮助我们将 JavaScript 代码逐步迁移到 TypeScript。

示例代码:

bashCopy code
npx tsc --init
npx tsc

解释:

  • 通过运行以上命令,我们可以初始化 TypeScript 配置文件,并编译 TypeScript 代码。

六、总结

通过本文的介绍,您已经了解了 TypeScript 的基础类型、对象类型、接口、断言等基本概念,以及进阶用法如类、泛型等。我还学习了 TypeScript 在工程实践中的应用,包括代码检测、编译配置、最佳实践和迁移工具。TypeScript 的强大功能和静态类型检查可以帮助您在开发过程中提高代码质量、可维护性和可扩展性,适用于各种规模的项目。通过不断实践和探索,您将能够更深入地理解和运用 TypeScript,构建更加优秀的软件项目。