TypeScript(TS) 的使用初识

我将详细讲解 TypeScript(TS) 的使用。TypeScript 是由微软开发的一种开源编程语言,它是 JavaScript 的超集,通过引入静态类型和面向对象编程特性,增强了 JavaScript 的开发体验和代码质量。TypeScript 最终会被编译成 JavaScript,因此可以在任何支持 JavaScript 的环境中运行,例如浏览器或 Node.js。

下面,我将从 TypeScript 的基础概念到高级特性,逐步为你讲解其使用方法。


1. TypeScript 简介

TypeScript 的核心优势在于:

  • 静态类型:开发者可以在编写代码时为变量、函数参数和返回值指定类型,编译器会在编译时检查类型错误,从而减少运行时 bug。
  • 面向对象编程:支持类、接口、继承等特性,使代码结构更清晰。
  • 工具支持:提供更好的代码补全、导航和重构功能,尤其在现代 IDE(如 VS Code)中。
  • 兼容性:完全兼容 JavaScript,可以直接使用现有的 JavaScript 代码和库。

2. 安装和配置

2.1 安装 TypeScript

要使用 TypeScript,首先需要安装 TypeScript 编译器。通过 npm(Node.js 的包管理器)全局安装:

npm install -g typescript

安装完成后,可以使用 tsc 命令编译 TypeScript 文件。例如:

tsc example.ts

这会将 example.ts 编译成 example.js

2.2 配置项目

在项目根目录下创建一个 tsconfig.json 文件,用于配置 TypeScript 编译器。以下是一个简单的配置示例:

{
    
    
  "compilerOptions": {
    
    
    "target": "es5",           // 编译目标为 ES5
    "module": "commonjs",      // 使用 CommonJS 模块系统
    "strict": true,            // 启用严格类型检查
    "outDir": "dist"           // 编译输出目录
  },
  "include": ["src/**/*"],     // 包含 src 目录下的所有文件
  "exclude": ["node_modules"]  // 排除 node_modules 目录
}

运行 tsc 命令时,编译器会根据 tsconfig.json 的配置编译项目。


3. 基本类型

TypeScript 支持 JavaScript 的所有基本类型,并扩展了一些额外的类型。

3.1 类型示例

以下是常用类型的定义和使用:

// 布尔值
let isDone: boolean = false;

// 数字
let age: number = 30;

// 字符串
let name: string = "John";

// 数组(两种写法)
let list1: number[] = [1, 2, 3];
let list2: Array<number> = [1, 2, 3];

// 元组(固定长度和类型的数组)
let tuple: [string, number] = ["hello", 10];

// 枚举
enum Color {
    
     Red, Green, Blue }
let c: Color = Color.Green; // 值从 0 开始递增

// 任意类型
let notSure: any = 4; // 可以是任意类型,但应尽量避免使用

// 无返回值
function warnUser(): void {
    
    
    console.log("This is a warning message");
}

// null 和 undefined
let u: undefined = undefined;
let n: null = null;

3.2 类型断言

类型断言用于告诉编译器某个值的具体类型,常用 as 关键字或尖括号语法:

let someValue: any = "this is a string";
let strLength: number = (someValue as string).length; // 类型断言为 string
// 或使用尖括号语法
let strLength2: number = (<string>someValue).length;

4. 接口(Interfaces)

接口用于定义对象的结构,指定属性和方法的类型。

4.1 基本接口

interface Person {
    
    
    name: string;
    age: number;
    greet(): void;
}

let user: Person = {
    
    
    name: "Jane",
    age: 25,
    greet() {
    
    
        console.log("Hello!");
    }
};

4.2 可选属性和只读属性

interface Config {
    
    
    color?: string;          // 可选属性
    readonly width: number;  // 只读属性
    [propName: string]: any; // 允许额外的任意属性
}

let config: Config = {
    
     width: 100 };
config.width = 200; // 错误:只读属性无法修改

5. 类(Classes)

TypeScript 支持类、继承和访问修饰符。

5.1 定义类

class Animal {
    
    
    protected name: string; // protected:仅类及其子类可访问
    constructor(name: string) {
    
    
        this.name = name;
    }
    move(distance: number) {
    
    
        console.log(`${
      
      this.name} moved ${
      
      distance}m.`);
    }
}

class Dog extends Animal {
    
    
    bark() {
    
    
        console.log("Woof! Woof!");
    }
}

let dog = new Dog("Buddy");
dog.bark(); // 输出: Woof! Woof!
dog.move(10); // 输出: Buddy moved 10m.

5.2 访问修饰符

  • public:默认,任何地方都可以访问。
  • private:仅类内部可访问。
  • protected:类及其子类可访问。

6. 函数

函数可以指定参数类型和返回值类型。

6.1 基本函数

function add(x: number, y: number): number {
    
    
    return x + y;
}

6.2 可选参数和默认参数

// 可选参数
function buildName(firstName: string, lastName?: string): string {
    
    
    return lastName ? `${
      
      firstName} ${
      
      lastName}` : firstName;
}

// 默认参数
function buildNameWithDefault(firstName: string, lastName: string = "Smith"): string {
    
    
    return `${
      
      firstName} ${
      
      lastName}`;
}

7. 泛型(Generics)

泛型允许在定义时不指定具体类型,使用时再确定类型。

7.1 泛型函数

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

let output1 = identity<string>("myString"); // 类型为 string
let output2 = identity<number>(42);         // 类型为 number

7.2 泛型类

class GenericNumber<T> {
    
    
    zeroValue: T;
    add: (x: T, y: T) => T;

    constructor(zeroValue: T, addFn: (x: T, y: T) => T) {
    
    
        this.zeroValue = zeroValue;
        this.add = addFn;
    }
}

let myGenericNumber = new GenericNumber<number>(0, (x, y) => x + y);

8. 模块(Modules)

TypeScript 使用 importexport 管理模块。

// math.ts
export function add(x: number, y: number): number {
    
    
    return x + y;
}

// main.ts
import {
    
     add } from './math';
console.log(add(2, 3)); // 输出: 5

9. 类型推断

TypeScript 会自动推断变量类型:

let x = 3; // x 被推断为 number

10. 联合类型和交叉类型

10.1 联合类型

允许一个值是多种类型之一:

function padLeft(value: string, padding: string | number) {
    
    
    if (typeof padding === "number") {
    
    
        return " ".repeat(padding) + value;
    }
    return padding + value;
}

10.2 交叉类型

合并多个类型:

interface A {
    
     a: number; }
interface B {
    
     b: number; }
type C = A & B;
let c: C = {
    
     a: 1, b: 2 };

11. 类型守卫

类型守卫用于运行时检查类型:

function isString(test: any): test is string {
    
    
    return typeof test === "string";
}

function example(foo: any) {
    
    
    if (isString(foo)) {
    
    
        console.log(foo.toUpperCase()); // foo 被视为 string
    }
}

12. 高级类型

12.1 条件类型

type NonNullable<T> = T extends null | undefined ? never : T;
type Foo = NonNullable<string | null>; // 类型为 string

12.2 映射类型

type Partial<T> = {
    
    
    [P in keyof T]?: T[P];
};
interface User {
    
     name: string; age: number; }
type PartialUser = Partial<User>; // { name?: string; age?: number; }

13. 与 JavaScript 的互操作

TypeScript 可以直接使用 JavaScript 代码,并通过类型声明文件(.d.ts)为其添加类型:

declare function $(selector: string): any;
let element = $("#id");

14. 工具和生态系统

  • IDE:VS Code 提供强大的 TypeScript 支持。
  • 构建工具:如 Webpack、Rollup。
  • 框架:Angular、React、Vue.js 都支持 TypeScript。

15. 最佳实践

  • 启用 "strict": true 以确保类型安全。
  • 尽量避免使用 any 类型。
  • 使用接口和类型别名提高代码可读性。
  • 利用类型推断减少冗余注解。

总结

TypeScript 通过静态类型和面向对象编程特性,大幅提升了前端开发的效率和代码质量。掌握 TypeScript 的使用,不仅能帮助你编写更健壮的代码,还能更好地适应现代前端框架和工具生态。

猜你喜欢

转载自blog.csdn.net/cuijiying/article/details/146492490
今日推荐