一、TypeScript 核心语法

1. 基础类型

TypeScript 在 JavaScript 基础上新增类型约束,常用基础类型如下:

  • 布尔值(boolean):仅包含 truefalse
  • 数字(number):支持整数、浮点数、十六进制等
  • 字符串(string):支持单引号、双引号
  • 数组:两种声明方式,一是“类型+[]”,二是“Array<类型>”
  • 枚举(enum):为一组数值赋予友好名称,默认从 0 开始编号,也可自定义值,如:
    enum Color { Red, Green, Blue }
    let c: Color = Color.Green; // 1(默认编号)
    // 自定义值
    enum Color2 { Red = 1, Green = 2, Blue = 4 }
    
  • null/undefined:是所有类型的子类型

2. 接口(Interface)

用于定义对象的“形状”,约束对象的属性名和属性类型,支持可选属性、只读属性:

// 基础接口
interface Person {
  readonly id: number; // 只读属性,初始化后不可修改
  name: string;
  age?: number; // 可选属性,可存在或不存在
}

// 使用接口约束对象
let person: Person = {
  id: 1,
  name: "Alice"
  // age 可选,可省略
};
person.id = 2; // 报错:只读属性不可修改

3. 函数类型

约束函数的参数类型和返回值类型,有两种声明方式:

  • 直接声明:明确参数和返回值类型,如:
    // (参数1: 类型, 参数2: 类型) => 返回值类型
    function add(a: number, b: number): number {
      return a + b;
    }
    
  • 接口定义函数类型:通过接口复用函数类型,如:
    interface AddFunc {
      (a: number, b: number): number;
    }
    let add: AddFunc = (a, b) => a + b;
    
  • 可选参数与默认参数:可选参数用 ? 标记,默认参数直接赋值,如:
    // 可选参数(必须放在必填参数后)
    function greet(name: string, age?: number): string {
      return age ? `Hi ${name}, ${age}` : `Hi ${name}`;
    }
    // 默认参数
    function getPrice(price: number, discount: number = 0.8): number {
      return price * discount;
    }
    

4. 类(Class)

TypeScript 增强了 ES6 类的功能,支持访问修饰符、类实现接口、继承等:

  • 访问修饰符:控制属性/方法的访问权限:
    • public(默认):类内、类外、子类均可访问;
    • private:仅类内可访问;
    • protected:类内和子类可访问。
    class Animal {
      public name: string; // 等同于 name: string
      private age: number;
      protected type: string;
    
      constructor(name: string, age: number, type: string) {
        this.name = name;
        this.age = age;
        this.type = type;
      }
    
      public sayName(): void {
        console.log(this.name);
        console.log(this.age); // 类内可访问 private 属性
      }
    }
    
    class Dog extends Animal {
      constructor(name: string, age: number) {
        super(name, age, "dog");
      }
    
      sayType(): void {
        console.log(this.type); // 子类可访问 protected 属性
        // console.log(this.age); // 报错:private 属性子类不可访问
      }
    }
    
    let cat = new Animal("Tom", 3, "cat");
    console.log(cat.name); // 可访问 public 属性
    // console.log(cat.age); // 报错:private 属性类外不可访问
    

5. 泛型(Generic)

解决“类型复用”问题,在定义函数、接口、类时不指定具体类型,使用时再传入类型,如:

  • 泛型函数
    // <T> 是泛型参数,代表“任意类型”,使用时传入具体类型
    function getArray<T>(items: T[]): T[] {
      return [...items];
    }
    
    // 使用时指定类型(也可省略,TS 自动推断)
    let numArr: number[] = getArray<number>([1, 2, 3]);
    let strArr: string[] = getArray(["a", "b"]); // 自动推断为 string 类型
    

二、Vue2 指令知识点

1. 插值表达式

用于将数据渲染到页面,语法为 {{ 数据 }},支持简单运算和表达式

  • 基础用法:渲染 data 中的数据,如:
    <template>
      <div>
        <p>姓名:{{ name }}</p>
        <p>年龄:{{ age + 1 }}</p> <!-- 支持简单运算 -->
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          name: "张三",
          age: 20
        };
      }
    };
    </script>
    

2. Vue2 常用指令

指令是带有 v- 前缀的特殊属性,用于操作 DOM、绑定数据等,常用指令如下:

(1)v-text

渲染文本,功能与插值表达式类似,但会覆盖元素内所有内容(插值表达式仅替换自身):

<template>
  <div v-text="name"></div> <!-- 等同于 <div>{{ name }}</div> -->
  <div>前缀:{{ name }}</div> <!-- 插值表达式可保留其他内容 -->
</template>
(2)v-html

渲染原始 HTML

<template>
  <div v-html="htmlContent"></div>
</template>

<script>
export default {
  data() {
    return {
      htmlContent: "<h1>这是一个标题</h1>" // 页面会渲染为 <h1> 标签
    };
  }
};
</script>
(3)v-bind

动态绑定 HTML 属性(如 srcclassstyle、自定义属性等),可简写为 :

  • 绑定普通属性
    <template>
      <img :src="imgUrl" :alt="imgAlt"> <!-- 绑定 src 和 alt 属性 -->
      <div :id="boxId"></div> <!-- 绑定 id 属性 -->
    </template>
    
    <script>
    export default {
      data() {
        return {
          imgUrl: "https://example.com/img.jpg",
          imgAlt: "示例图片",
          boxId: "container"
        };
      }
    };
    </script>
    
  • 绑定 class:支持对象、数组两种写法:
    <template>
      <!-- 对象写法:键是类名,值是布尔值(true 则添加类) -->
      <div :class="{ active: isActive, red: isRed }"></div>
      <!-- 数组写法:直接传入类名数组 -->
      <div :class="[activeClass, redClass]"></div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          isActive: true,
          isRed: false,
          activeClass: "active",
          redClass: "red"
        };
      }
    };
    </script>
    
(4)v-on

绑定事件监听器,可简写为 @,支持事件修饰符(如 stopprevent)和按键修饰符(如 enter):

  • 基础用法
    <template>
      <button @click="handleClick">点击按钮</button>
      <input @input="handleInput" placeholder="输入内容">
    </template>
    
    <script>
    export default {
      methods: {
        handleClick() {
          alert("按钮被点击");
        },
        handleInput(e) { // e 是原生事件对象
          console.log("输入内容:", e.target.value);
        }
      }
    };
    </script>
    
  • 事件修饰符:通过“.”添加,常用修饰符:
    • stop:阻止事件冒泡;
    • prevent:阻止默认行为(如表单提交、链接跳转);
    <template>
      <div @click="parentClick">
        <!-- stop 阻止冒泡:点击按钮不会触发 parentClick -->
        <button @click.stop="childClick">子按钮</button>
      </div>
      <!-- prevent 阻止默认行为:点击链接不会跳转 -->
      <a @click.prevent href="https://example.com">不跳转链接</a>
      <!-- once 只触发一次 -->
      <button @click.once="onceClick">只点一次</button>
    </template>
    
(5)v-model

实现表单元素(输入框、单选框、复选框等)与数据的“双向绑定”

  • 输入框(text/textarea)
    <template>
      <input v-model="message" placeholder="输入内容">
      <p>输入的内容:{{ message }}</p>
    </template>
    
    <script>
    export default {
      data() {
        return {
          message: "" // 输入框内容变化时,message 自动更新;反之亦然
        };
      }
    };
    </script>
    
  • 单选框(radio)
    <template>
      <label>
        <input type="radio" v-model="gender" value="male"> 男
      </label>
      <label>
        <input type="radio" v-model="gender" value="female"> 女
      </label>
      <p>选择的性别:{{ gender }}</p>
    </template>
    
    <script>
    export default {
      data() {
        return {
          gender: "male" // 默认选中“男”
        };
      }
    };
    </script>
    
  • 复选框(checkbox):单个复选框绑定布尔值,多个复选框绑定数组:
    <template>
      <!-- 单个复选框:绑定布尔值 -->
      <label>
        <input type="checkbox" v-model="isAgree"> 同意协议
      </label>
      <!-- 多个复选框:绑定数组 -->
      <div>
        <label><input type="checkbox" v-model="hobbies" value="game"> 游戏</label>
        <label><input type="checkbox" v-model="hobbies" value="reading"> 阅读</label>
      </div>
      <p>是否同意:{{ isAgree }}</p>
      <p>爱好:{{ hobbies }}</p>
    </template>
    
    <script>
    export default {
      data() {
        return {
          isAgree: false,
          hobbies: [] // 选中的爱好会添加到数组中
        };
      }
    };
    </script>
    
(6)v-for

基于数组或对象循环渲染 DOM,语法为 v-for=“(item, index) in 数组”(数组)或 v-for="(value, key, index) in 对,搭配 key 属性唯一标识,提升渲染性能

  • 循环数组
    <template>
      <ul>
        <li v-for="(item, index) in list" :key="index">
          {{ index + 1 }}. {{ item.name }} - {{ item.age }}岁
        </li>
      </ul>
    </template>
    
    <script>
    export default {
      data() {
        return {
          list: [
            { name: "张三", age: 20 },
            { name: "李四", age: 22 }
          ]
        };
      }
    };
    </script>
    
(7)v-if / v-else-if / v-else

根据条件渲染 DOM(条件不满足时,元素会被从 DOM 中移除),与 v-show 的区别:v-show 是通过 CSS display: none 隐藏元素(元素始终存在于 DOM 中):

<template>
  <div v-if="score >= 90">优秀</div>
  <div v-else-if="score >= 80">良好</div>
  <div v-else-if="score >= 60">及格</div>
  <div v-else>不及格</div>

  <!-- v-show 隐藏元素(DOM 中存在) -->
  <div v-show="isShow">通过 CSS 隐藏</div>
</template>

<script>
export default {
  data() {
    return {
      score: 85,
      isShow: false
    };
  }
};
</script>

更多推荐