我的日常开发记录日志
首页
  • Laravel
  • Thinkphp
  • Swoole
  • Workman
  • php
  • HTML
  • CSS
  • JavaScript
  • Vue
  • ES6
  • 小程序
  • Mysql
  • Redis
  • Es
  • MongoDb
  • Git
  • Composer
  • Linux
  • Nginx
  • Docker
  • Vpn
  • 开发实战
  • 开发工具类
  • 友情链接
💖关于
💻收藏
  • 分类
  • 标签
  • 归档数据
GitHub (opens new window)

我的日常开发记录日志

never give up
首页
  • Laravel
  • Thinkphp
  • Swoole
  • Workman
  • php
  • HTML
  • CSS
  • JavaScript
  • Vue
  • ES6
  • 小程序
  • Mysql
  • Redis
  • Es
  • MongoDb
  • Git
  • Composer
  • Linux
  • Nginx
  • Docker
  • Vpn
  • 开发实战
  • 开发工具类
  • 友情链接
💖关于
💻收藏
  • 分类
  • 标签
  • 归档数据
GitHub (opens new window)
  • html

  • css

  • javascript

  • vue

  • 小程序

  • Es6

    • ES6
    • ts基础
    • ts注解
    • ts泛型
    • ts对象接口类型
    • vue使用js转换到ts差异
    • 前端
    • Es6
    窝窝侠
    2024-11-19

    vue使用js转换到ts差异

    Vue 3 + TypeScript 和 Vue 3 + JavaScript 的


    # 1. 安装 TypeScript 和相关依赖

    # Vue 3 + JavaScript

    在 Vue 3 + JavaScript 中,通常不需要安装 TypeScript 相关依赖,只需安装 Vue 相关包即可。

    npm install vue
    
    1

    # Vue 3 + TypeScript

    对于 Vue 3 + TypeScript,你需要安装 TypeScript 和相关的 Vue 3 类型支持包。可以通过以下命令安装:

    npm install --save-dev typescript @types/node @vue/compiler-sfc ts-loader vue-loader
    
    1

    同时你需要配置 tsconfig.json 文件,确保 TypeScript 能够正确识别和编译 Vue 文件。

    tsconfig.json 配置示例:

    {
      "compilerOptions": {
        "target": "esnext",        // 编译目标为 ESNext,支持最新的 JavaScript 特性
        "module": "esnext",        // 使用 ES 模块系统
        "moduleResolution": "node",  // Node 模块解析策略
        "strict": true,            // 启用严格模式,开启所有严格类型检查
        "jsx": "preserve",         // 保留 JSX 语法以便处理 Vue 文件
        "esModuleInterop": true,   // 允许默认导入非 ES6 模块
        "skipLibCheck": true,      // 跳过库文件类型检查,提升性能
        "lib": ["esnext", "dom"],  // 包括最新的 ES 和 DOM 库
        "allowJs": true            // 允许同时使用 .js 和 .ts 文件
      },
      "include": ["src/**/*.ts", "src/**/*.vue"],  // 包含 TypeScript 和 Vue 文件
      "exclude": ["node_modules"]                   // 排除 node_modules 文件夹
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    # 2. 定义 Vue 组件

    # Vue 3 + JavaScript

    在 JavaScript 中,组件通常使用 export default 定义,采用 Options API 来组织组件的选项。

    // MyComponent.vue
    <template>
      <div>
        <p>{{ message }}</p>
        <button @click="greet">Greet</button>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          message: "Hello, Vue 3 with JavaScript!"
        };
      },
      methods: {
        greet() {
          console.log(this.message);
        }
      }
    };
    </script>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    # Vue 3 + TypeScript

    在 TypeScript 中,使用 defineComponent 来定义组件。这样可以让 TypeScript 更好地推导类型并进行类型检查。

    // MyComponent.vue
    <template>
      <div>
        <p>{{ message }}</p>
        <button @click="greet">Greet</button>
      </div>
    </template>
    
    <script lang="ts">
    import { defineComponent } from 'vue';
    
    export default defineComponent({
      name: 'MyComponent',
      data() {
        return {
          message: "Hello, Vue 3 with TypeScript!"
        };
      },
      methods: {
        greet() {
          console.log(this.message);
        }
      }
    });
    </script>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    区别:

    • 在 TypeScript 中,组件的定义通过 defineComponent 进行,这有助于 TypeScript 进行类型推导和检查。
    • JavaScript 仅依赖 Vue 的 Options API,不提供类型推导。

    # 3. 定义 Props

    # Vue 3 + JavaScript

    在 JavaScript 中,使用 props 选项来定义组件的 props。对于 prop 的类型没有类型检查,所以可能会有运行时错误。

    // MyComponent.vue
    <template>
      <div>
        <p>{{ name }} is {{ age }} years old</p>
      </div>
    </template>
    
    <script>
    export default {
      props: {
        name: String,
        age: {
          type: Number,
          default: 30
        }
      }
    };
    </script>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    # Vue 3 + TypeScript

    在 TypeScript 中,defineProps 可以用来声明 props 的类型,提供类型检查。TypeScript 会推导出 props 的类型。

    // MyComponent.vue
    <template>
      <div>
        <p>{{ name }} is {{ age }} years old</p>
      </div>
    </template>
    
    <script lang="ts" setup>
    defineProps<{
      name: string;
      age: number;
    }>();
    </script>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    区别:

    • JavaScript 中 props 的类型是通过 type 属性声明的,但没有类型检查,容易产生运行时错误。
    • TypeScript 中,通过 defineProps 显式声明类型,确保类型安全。

    # 4. 使用 ref 和 reactive

    # Vue 3 + JavaScript

    在 JavaScript 中使用 ref 或 reactive 时,不会有类型推导,容易导致类型错误,尤其是对于复杂数据结构。

    // MyComponent.vue
    <template>
      <div>
        <button @click="increment">Increment</button>
        <p>{{ count }}</p>
      </div>
    </template>
    
    <script>
    import { ref } from 'vue';
    
    export default {
      setup() {
        const count = ref(0);  // ref 是一个响应式引用
    
        const increment = () => {
          count.value++;
        };
    
        return {
          count,
          increment
        };
      }
    };
    </script>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

    # Vue 3 + TypeScript

    在 TypeScript 中,使用 ref 和 reactive 时,你可以显式指定类型,确保类型推导的准确性。

    // MyComponent.vue
    <template>
      <div>
        <button @click="increment">Increment</button>
        <p>{{ count }}</p>
      </div>
    </template>
    
    <script lang="ts" setup>
    import { ref } from 'vue';
    
    const count = ref<number>(0);  // 显式指定类型
    
    const increment = () => {
      count.value++;
    };
    </script>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    区别:

    • JavaScript 中,ref 默认推导为 any 类型,不提供类型检查。
    • TypeScript 中,ref 的类型可以通过泛型显式指定,确保类型安全。

    # 5. 计算属性和监听器

    # Vue 3 + JavaScript

    在 JavaScript 中使用计算属性时,返回值没有类型推导,且容易漏掉类型检查。

    // MyComponent.vue
    <template>
      <div>
        <p>{{ doubleCount }}</p>
        <button @click="increment">Increment</button>
      </div>
    </template>
    
    <script>
    import { ref, computed } from 'vue';
    
    export default {
      setup() {
        const count = ref(0);
        const doubleCount = computed(() => count.value * 2);  // 计算属性
    
        const increment = () => {
          count.value++;
        };
    
        return {
          count,
          doubleCount,
          increment
        };
      }
    };
    </script>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28

    # Vue 3 + TypeScript

    在 TypeScript 中,计算属性的类型可以被自动推导,或者你可以手动指定类型。

    // MyComponent.vue
    <template>
      <div>
        <p>{{ doubleCount }}</p>
        <button @click="increment">Increment</button>
      </div>
    </template>
    
    <script lang="ts" setup>
    import { ref, computed } from 'vue';
    
    const count = ref<number>(0);
    const doubleCount = computed<number>(() => count.value * 2);  // 显式指定返回类型
    
    const increment = () => {
      count.value++;
    };
    </script>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    区别:

    • JavaScript 中,计算属性没有类型推导,容易遗漏类型检查。
    • TypeScript 中,计算属性的返回类型可以自动推导,也可以手动指定,避免类型错误。

    # 6. Vuex 和 TypeScript 配合使用

    # Vue 3 + JavaScript

    在 JavaScript 中,Vuex 的状态和 getter、mutation 等方法没有类型检查,可能会出现类型错误。

    // store.js
    import { createStore } from 'vuex';
    
    export const store = createStore({
      state() {
        return {
          count: 0
        };
      },
      mutations: {
        increment(state) {
          state.count++;
        }
      },
      actions: {
        increment({ commit }) {
          commit('increment');
        }
      },
      getters: {
        count(state) {
          return state.count;
        }
      }
    });
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    # Vue 3 + TypeScript

    在 TypeScript 中,可以为 Vuex 的状态、mutations 和 getters 提供类型声明,从而确保类型安全。

    // store.ts
    import { createStore } from 'vuex';
    
    interface State {
      count: number;
    }
    
    export const store = createStore<State>({
     
    
     state: {
        count: 0
      },
      mutations: {
        increment(state) {
          state.count++;
        }
      },
      actions: {
        increment({ commit }) {
          commit('increment');
        }
      },
      getters: {
        count(state) {
          return state.count;
        }
      }
    });
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29

    区别:

    • JavaScript 中,Vuex 的状态没有类型检查,容易导致运行时错误。
    • TypeScript 中,Vuex 状态和方法都能进行类型检查,确保代码的健壮性。

    # 总结

    特性 Vue 3 + JavaScript Vue 3 + TypeScript
    类型检查 无类型检查,易出错 类型推导和类型检查,安全性高
    开发效率 快速开发,适合小型项目 适合中大型项目,减少潜在错误
    维护性 难以维护大型项目 更易维护,自动推导类型
    组件定义 直接使用 data, methods 使用 defineComponent 增强类型推导
    Props 类型 无类型检查,运行时验证 显式指定类型,享受编译时验证
    Vuex 状态管理 无类型安全 类型安全,状态和方法类型明确
    可扩展性 不适合较大项目 高扩展性,适合团队开发

    在开发过程中,JavaScript 适合快速开发和小型项目,但缺乏类型检查容易导致潜在错误。而 TypeScript 提供了更高的安全性和类型推导,适合较复杂的应用和团队开发,能有效减少错误并提高代码可维护性。

    在线编辑 (opens new window)
    上次更新: 2025/02/25, 18:30:54
    ts对象接口类型

    ← ts对象接口类型

    最近更新
    01
    showprocess用法
    04-29
    02
    vue3中尖括号和冒号的使用细则
    04-29
    03
    sd使用
    02-22
    更多文章>
    🖥️

    © 2025窝窝侠 💌 豫ICP备20005263号-2 🛀 Theme by 💝 Vdoing && 小胖墩er

    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×