# TypeScript

TypeScript (opens new window) 是具有类型语法的 JavaScript。

# 一、类型系统

JavaScript (opens new window) 定义了 8 种内置类型,TypeScript (opens new window) 为内置类型提供了相应的基元类型。

# 基础类型

# 原始类型

# 特殊类型

  • any (opens new window)

    TypeScript 中的一个逃逸类型,可以绕过类型检查系统,因此不会对值进行任何类型检查。

    let notSure: any = 4;
    notSure = "maybe a string instead";
    notSure = false;
    
  • unknown (opens new window)

    unknown 类型也表示不确定的类型,但与 any 不同,它是类型安全的。

    当一个值声明为 unknown 类型时,必须在使用它之前先进行类型检查或类型断言,以告诉 TypeScript 它的确切类型。

    let notSure: unknown = 4;
    notSure = "maybe a string instead";
    notSure = false;
    

# 空类型

  • never (opens new window)

    never 类型表示永不存在的值的类型,常用于表示会抛出异常的函数的返回值。

    function error(message: string): never {
      throw new Error(message);
    }
    

# 对象类型

# 基础对象

# 结构化对象

  • Array (opens new window)

    // 使用「类型 + 方括号」来表示数组
    let fibonacci: number[] = [1, 1, 2, 3, 5];
    
    // 使用数组泛型来表示数组
    let fibonacci: Array<number> = [1, 1, 2, 3, 5];
    
  • Tuple (opens new window)

    Array 合并相同类型的对象,而 Tuple 合并不同类型的对象。Tuple 有固定的长度,一旦创建,其长度不能更改。

    let tom: [string, number] = ['Tom', 25];
    

# 枚举对象

  • enum (opens new window)

    枚举类型用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等。

    enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
    let day: Days = Days.Mon;
    

# 高级类型

# 类型组合

# 类型抽象

# 函数类型

# 类型操作

# 类型推断

# 类型断言

# 类型导入

# 类型推断

  • Promise

    提取异步函数返回值的类型。

    // 定义返回对象类型
    interface _InvoiceData {
      date: string;
      number: string;
      height: number;
    }
    
    // 定义函数类型
    type ExtractInvoiceDataFunction = (file: File) => Promise<_InvoiceData>;
    
    // 使用 Awaited 和 ReturnType
    type InvoiceData = Awaited<ReturnType<ExtractInvoiceDataFunction>>;
    
    // 如果 TypeScript 版本较低(<4.5),可自定义条件类型
    type ExtractPromiseType<T> = T extends Promise<infer U> ? U : T;
    type InvoiceData = ExtractPromiseType<ReturnType<ExtractInvoiceDataFunction>>;
    

# 二、工程配置

tsconfig.json (opens new window) 是 TypeScript 项目的配置文件,用于配置 TypeScript 编译器的行为以及项目的类型检查选项。

# 配置文件结构

{
  "compilerOptions": { ... },
  "include": [ ... ],
  "exclude": [ ... ]
}

# 编译选项

# 核心编译策略

# 类型检查策略

# 模块解析策略

# 产出物控制

# 三、开发环境

Node.js 默认不支持直接执行 .ts 文件,需要配置开发环境进行转译执行。

# ts-node

可以使用 ts-node 直接运行。

  • 安装依赖ts-node (opens new window), typescript (opens new window)

    npm install -g ts-node typescript
    
    # 对于项目级使用,建议本地安装
    npm install --save-dev ts-node typescript
    
  • 配置编译规则

    在项目根目录初始化 tsconfig.json

    tsc --init
    
  • 执行 TypeScript 文件

    ts-node test.ts
    

# tsx

可以使用 tsx (opens new window) 直接运行。

npm i -D tsx
npx tsx src/index.ts

# Reference