1. JavaScript有什么缺点?TypeScript弥补了JavaScript的什么缺点?

JavaScript的缺点:

  1. 弱类型系统:JavaScript是动态弱类型语言,变量类型在运行时才能确定,容易导致类型错误
  2. 缺乏类型检查:开发时无法提前发现类型不匹配的错误,增加了调试难度
  3. 代码可维护性差:大型项目中,没有类型注解的代码难以理解和维护
  4. 重构困难:修改代码时,IDE无法提供准确的重构支持
  5. 团队协作障碍:不同开发者对变量类型的理解可能不一致

TypeScript弥补的缺点:

  1. 静态类型检查:在编译阶段就能发现类型错误,减少运行时错误
  2. 类型注解:提供明确的类型声明,提高代码可读性和可维护性
  3. 更好的IDE支持:提供智能提示、代码补全和重构支持
  4. 渐进式采用:可以逐步将JavaScript项目迁移到TypeScript
  5. ECMAScript兼容:支持最新的JavaScript特性,并添加类型系统

2. TypeScript有什么特点?哪些框架或者项目在使用TypeScript?

TypeScript的特点:

  1. 静态类型系统:在编译时进行类型检查,提高代码质量
  2. 类型推断:即使不显式声明类型,TypeScript也能自动推断变量类型
  3. 面向对象特性:支持类、接口、泛型、装饰器等面向对象编程特性
  4. 编译为JavaScript:最终编译为纯JavaScript,可以在任何支持JavaScript的环境中运行
  5. 工具链完善:拥有丰富的开发工具和生态系统支持

使用TypeScript的框架和项目:

  1. 前端框架

    • Angular(完全使用TypeScript开发)
    • Vue.js 3.x(官方支持TypeScript)
    • React(通过@types/react提供类型支持)
    • Svelte(支持TypeScript)
  2. 后端框架

    • NestJS(基于TypeScript的Node.js框架)
    • Express(可以通过@types/express添加类型支持)
    • Fastify(原生支持TypeScript)
  3. 大型项目

    • Visual Studio Code(微软开发,使用TypeScript)
    • Slack桌面应用
    • Asana项目管理工具
    • Airbnb的部分前端项目

3. TypeScript的运行环境如何搭建?如何运行TypeScript代码?

TypeScript运行环境搭建:

  1. 安装Node.js

    • 从官网下载并安装Node.js(建议使用LTS版本)
    • 验证安装:node -vnpm -v
  2. 安装TypeScript

    # 全局安装
    npm install -g typescript
    
    # 或作为项目依赖安装
    npm install --save-dev typescript
    
  3. 初始化TypeScript配置

    # 生成tsconfig.json配置文件
    tsc --init
    
  4. 配置编辑器

    • VS Code:内置TypeScript支持
    • WebStorm:原生支持TypeScript
    • 其他编辑器:安装相应的TypeScript插件

运行TypeScript代码的几种方式:

  1. 编译后运行

    # 编译TypeScript文件
    tsc app.ts
    
    # 运行生成的JavaScript文件
    node app.js
    
  2. 使用ts-node直接运行

    # 安装ts-node
    npm install -g ts-node
    
    # 直接运行TypeScript文件
    ts-node app.ts
    
  3. 使用nodemon监控变化

    # 安装nodemon和ts-node
    npm install -g nodemon ts-node
    
    # 监控TypeScript文件变化并自动重启
    nodemon --exec ts-node app.ts
    
  4. 在浏览器中运行

    • 编译为JavaScript后在HTML中引入
    • 使用webpack、vite等打包工具

4. 如何定义TypeScript的变量,定义变量支持哪些JavaScript类型?

TypeScript变量定义语法:

  1. 基本语法

    // 显式类型注解
    let name: string = "张三";
    let age: number = 25;
    let isStudent: boolean = true;
    
    // 类型推断(自动推断为string)
    let message = "Hello TypeScript";
    
  2. 变量声明关键字

    // let - 块级作用域,可重新赋值
    let count: number = 10;
    count = 20; // 允许
    
    // const - 块级作用域,不可重新赋值
    const PI: number = 3.14159;
    // PI = 3.14; // 错误:常量不可重新赋值
    
    // var - 函数作用域(不推荐使用)
    var oldWay: string = "不推荐";
    

支持的JavaScript基本类型:

  1. 原始类型

    // 字符串
    let str: string = "Hello";
    
    // 数字(包括整数、浮点数、NaN、Infinity)
    let num: number = 42;
    let float: number = 3.14;
    let infinity: number = Infinity;
    
    // 布尔值
    let bool: boolean = true;
    
    // null和undefined
    let n: null = null;
    let u: undefined = undefined;
    
    // Symbol(ES6新增)
    let sym: symbol = Symbol("unique");
    
    // BigInt(ES2020新增)
    let big: bigint = 9007199254740991n;
    
  2. 引用类型

    // 数组
    let numbers: number[] = [1, 2, 3];
    let strings: Array<string> = ["a", "b", "c"];
    
    // 对象
    let person: { name: string; age: number } = {
      name: "张三",
      age: 25
    };
    
    // 函数
    let greet: (name: string) => string = function(name) {
      return `Hello, ${name}`;
    };
    

5. 常见的TypeScript特有类型有哪些?这些类型有什么作用?

TypeScript特有类型及其作用:

  1. 联合类型(Union Types)

    // 变量可以是多种类型之一
    let id: string | number;
    id = "ABC123"; // 允许
    id = 123;      // 允许
    // id = true;   // 错误:只能是string或number
    
    // 应用场景:处理多种可能的输入
    function printId(id: string | number) {
      console.log(`ID: ${id}`);
    }
    
  2. 交叉类型(Intersection Types)

    // 合并多个类型的属性
    interface Person {
      name: string;
      age: number;
    }
    
    interface Employee {
      employeeId: string;
      department: string;
    }
    
    type Staff = Person & Employee;
    
    const staff: Staff = {
      name: "李四",
      age: 30,
      employeeId: "E001",
      department: "技术部"
    };
    
  3. 类型别名(Type Aliases)

    // 为复杂类型创建别名
    type Point = {
      x: number;
      y: number;
    };
    
    type ID = string | number;
    
    // 使用类型别名
    function draw(point: Point): void {
      console.log(`Drawing at (${point.x}, ${point.y})`);
    }
    
  4. 字面量类型(Literal Types)

    // 精确到具体值
    type Direction = "up" | "down" | "left" | "right";
    type Status = 200 | 404 | 500;
    
    let move: Direction = "up"; // 只能是指定的四个值之一
    let httpStatus: Status = 200; // 只能是200、404或500
    
    // 应用场景:限制输入范围
    function setStatus(status: Status): void {
      console.log(`Status set to: ${status}`);
    }
    
  5. 泛型(Generics)

    // 创建可重用的类型安全组件
    function identity<T>(arg: T): T {
      return arg;
    }
    
    // 使用泛型
    let output1 = identity<string>("hello"); // 类型为string
    let output2 = identity<number>(42);      // 类型为number
    
    // 泛型接口
    interface Box<T> {
      content: T;
    }
    
    let stringBox: Box<string> = { content: "hello" };
    let numberBox: Box<number> = { content: 42 };
    
  6. 枚举类型(Enums)

    // 定义一组命名常量
    enum Color {
      Red = "RED",
      Green = "GREEN",
      Blue = "BLUE"
    }
    
    enum StatusCode {
      Success = 200,
      NotFound = 404,
      ServerError = 500
    }
    
    // 使用枚举
    let myColor: Color = Color.Red;
    function handleResponse(code: StatusCode): void {
      if (code === StatusCode.Success) {
        console.log("请求成功");
      }
    }
    
  7. 元组类型(Tuples)

    // 固定长度和类型的数组
    let person: [string, number, boolean] = ["张三", 25, true];
    
    // 访问元组元素
    let name: string = person[0]; // "张三"
    let age: number = person[1];  // 25
    
    // 可选元素和剩余元素
    let options: [string, number?] = ["选项1"]; // 第二个元素可选
    let list: [string, ...number[]] = ["标签", 1, 2, 3]; // 剩余元素
    

更多推荐