TypeScript-从0开始-20260408

3 阅读1分钟

TypeScript

一、TypeScript 优缺点与集成

1. TypeScript 与 JavaScript 的区别

问题:TypeScript 与 JavaScript 的区别

答案核心回答:TypeScript 是 JavaScript 的超集,增加了静态类型检查和面向对象特性。

详细说明

方面JavaScriptTypeScript
类型系统动态类型静态类型(可选)
编译解释执行编译为 JS
类型推断
接口/泛型
编译时检查
IDE 支持一般优秀

代码示例

// TypeScript 类型注解
let name: string = '张三';
let age: number = 25;
let isActive: boolean = true;

// 函数类型
function greet(name: string): string {
    return `Hello, ${name}`;
}

// 接口
interface User {
    name: string;
    age: number;
    email?: string; // 可选属性
}

const user: User = {
    name: '张三',
    age: 25
};

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

2. TypeScript 的优势

问题:TypeScript 的优势

答案核心回答:TypeScript 提供类型安全、更好的 IDE 支持、更易维护的大型代码库。

代码示例

// 类型安全
function processUser(user: User) {
    console.log(user.name);
}
processUser({ name: '张三', age: 25 }); // 正确
// processUser('invalid'); // 编译错误

// 代码补全
// IDE 会提示 string 方法

// 重构支持
// 类型定义使得重构更安全

3. TypeScript 的缺点

问题:TypeScript 的缺点

答案核心回答:需要编译步骤、类型定义可能繁琐、有学习成本。

代码示例

// 1. 需要编译
// tsc main.ts

// 2. 类型定义繁琐
const config: {
    apiUrl: string;
    timeout: number;
    headers?: Record<string, string>;
} = {
    apiUrl: 'https://api.example.com',
    timeout: 3000
};

// 3. any 类型滥用会失去类型安全
function legacy(data: any) {
    return data.foo.bar;
}

4. TypeScript 编译原理

问题:TypeScript 编译原理

答案核心回答:TypeScript 编译器解析源码生成 AST,绑定符号,进行类型检查,最后输出 JavaScript。

代码示例

// TypeScript 编译流程
// 1. 解析 - 源码 → AST
// 2. 绑定 - 创建符号表
// 3. 检查 - 类型检查
// 4. 发射 - 输出 JS

5. TypeScript 类型声明

问题:TypeScript 类型声明

答案核心回答:使用 declare.d.ts 文件声明类型。

代码示例

// 声明模块
declare module 'my-module' {
    export function doSomething(): void;
}

// 声明全局变量
declare const GLOBAL_CONFIG: {
    apiUrl: string;
};

// .d.ts 文件示例
interface Window {
    myPlugin: {
        init(): void;
        destroy(): void;
    };
}

二、TypeScript 配置与编译

6. 编译选项

问题:编译选项

答案核心回答:tsconfig.json 中的 compilerOptions 控制编译行为。

代码示例

{
    "compilerOptions": {
        "target": "ES2020",
        "module": "ESNext",
        "strict": true,
        "noImplicitAny": true,
        "strictNullChecks": true,
        "outDir": "./dist",
        "rootDir": "./src",
        "declaration": true,
        "sourceMap": true
    }
}

7. strict 选项

问题:strict 选项

答案核心回答:启用所有严格类型检查选项。

代码示例

{
    "compilerOptions": {
        "strict": true
    }
}

三、其他 TypeScript 特性

8. 枚举

问题:TypeScript 枚举

答案核心回答:枚举是一组命名常量,分为数字枚举和字符串枚举。

代码示例

// 数字枚举
enum Direction {
    Up,    // 0
    Down,  // 1
    Left,  // 2
    Right  // 3
}

// 字符串枚举
enum Message {
    Success = '操作成功',
    Error = '操作失败'
}

// const 枚举
const enum Color {
    Red = '#ff0000'
}

9. never 类型

问题:never 类型

答案核心回答:never 表示永不返回的类型。

代码示例

// 函数永不返回
function throwError(msg: string): never {
    throw new Error(msg);
}

function infiniteLoop(): never {
    while (true) {}
}

10. unknown 类型

问题:unknown 类型

答案核心回答:unknown 是安全的 any,必须进行类型检查后才能使用。

代码示例

let unknownValue: unknown;
// unknownValue.toFixed(2); // Error
if (typeof unknownValue === 'number') {
    unknownValue.toFixed(2); // OK
}

11. 元组

问题:TypeScript 元组

答案核心回答:元组是固定长度、每元素类型已知的数组。

代码示例

let tuple: [string, number];
tuple = ['hello', 42];

// 解构
const [name, age] = tuple;

// 函数返回元组
function getUser(): [string, number] {
    return ['张三', 25];
}

12. 函数重载

问题:TypeScript 函数重载

答案核心回答:同一函数名不同参数类型的多个签名。

代码示例

function reverse(str: string): string;
function reverse(arr: number[]): number[];
function reverse<T>(value: T[] | string): T[] | string {
    if (typeof value === 'string') {
        return value.split('').reverse().join('');
    }
    return value.slice().reverse();
}

13. 泛型

问题:泛型

答案核心回答:泛型是创建可复用组件的类型变量。

代码示例

// 泛型函数
function identity<T>(arg: T): T {
    return arg;
}

// 泛型接口
interface Container<T> {
    value: T;
}

// 泛型约束
function longest<T extends { length: number }>(a: T, b: T): T {
    return a.length > b.length ? a : b;
}

14. 类型推断与类型断言

问题:类型推断与类型断言

答案核心回答:TypeScript 自动推断类型,类型断言强制指定类型。

代码示例

// 类型推断
let x = 3; // number
let y = [1, 2, 3]; // number[]

// 类型断言
let someValue: unknown = 'hello';
let strLength: number = (someValue as string).length;

// 非空断言
element!.style.color = 'red';

15. 接口与类型别名

问题:type 与 interface 的区别

答案核心回答:interface 用于对象结构,type 用于联合类型等复杂类型。

代码示例

// interface
interface User {
    name: string;
    age: number;
}

// type
type Point = { x: number; y: number };
type Color = 'red' | 'green' | 'blue';

// 区别:interface 可声明合并
interface A { a: number; }
interface A { b: string; }

16. 装饰器

问题:装饰器

答案核心回答:装饰器是修改类行为的特殊函数。

代码示例

// 方法装饰器
function log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    const original = descriptor.value;
    descriptor.value = function(...args: any[]) {
        console.log(`Calling ${propertyKey}`);
        return original.apply(this, args);
    };
}

class Calculator {
    @log
    add(a: number, b: number): number {
        return a + b;
    }
}

四、工具类型

17. 常用工具类型

问题:常用工具类型

答案核心回答:Partial、Required、Readonly、Pick、Omit 等是内置工具类型。

代码示例

interface User {
    name: string;
    age: number;
    email: string;
}

// Partial - 所有属性可选
type PartialUser = Partial<User>;

// Required - 所有属性必需
type RequiredUser = Required<User>;

// Readonly - 所有属性只读
type ReadonlyUser = Readonly<User>;

// Pick - 选取部分属性
type UserPreview = Pick<User, 'name' | 'email'>;

// Omit - 排除部分属性
type UserWithoutAge = Omit<User, 'age'>;

// ReturnType - 获取函数返回类型
function getUser() { return { name: '张三' }; }
type UserType = ReturnType<typeof getUser>;