TypeScript应用

目录

TypeScript应用

vue项目中使用ts,script加上 lang="ts" 才能写ts代码

复制代码
<script setup lang="ts">

</script>
defineProps的TS写法

父组件

复制代码
<template>
  <div>
    <h2>父组件</h2>
    <p>{{ money }}---{{ car }}</p>
    <MyCom :money="money" ></MyCom>
  </div>
</template>

<script setup lang="ts">
import MyCom from './components/MyCom.vue';
import {reactive,ref} from 'vue'
let money =ref(1000);
let car = ref("宝马")
</script>

子组件

复制代码
<template>
    <div>
      <h2>子组件</h2>
      <p>{{ money }}====={{ car }}</p>
    </div>
</template>
<script setup lang="ts">
//   const props = defineProps({
//     money:{
//         type:Number,
//         required:true
//     },
//     car:{
//         type:String,
//         required:false,
//         default:"麻喇沙蒂"
//     }
//   })
// 1.通过泛型参数来定义props的类型
// const props = defineProps<{
//     money:number
//     car?:string
// }>()
// 2.给props设置默认值 需要使用withDefaults
// const props = withDefaults(
//    defineProps<{
//     money:number;
//     car?:string
//    }>(),
//    {
//      car:"麻喇沙蒂"
//    }
// )
// 3.上面的写法太笨拙, 使用响应式语法糖 解构 + defineProps
const {money,car = "麻喇沙蒂"} = defineProps<{
    money:number
    car?:string
}>()
// 默认值没有显示   需要显式的选择开启
</script>

默认值没有显示 需要显示的选择开启

复制代码
//vite.config.ts
export default defineConfig({
  plugins: [vue({
    reactivityTransform:true
  })],
})
defineEmits的TS写法

父组件

复制代码
<template>
  <div>
    <h2>父组件</h2>
    <p>{{ money }}---{{ car }}</p>
    <MyCom :money="money" @changeMoney="change"></MyCom>
  </div>
</template>
<script setup lang="ts">
import MyCom from './components/MyCom.vue';
import {reactive,ref} from 'vue'
let money =ref(1000);
let car = ref("宝马")

const change = (v:number)=>{
  money.value -= v
}
</script>

子组件

复制代码
<template>
    <div>
      <h2>子组件</h2>
      <p>{{ money }}====={{ car }}</p>
      <button @click="changeMoney">更改money</button>
    </div>
</template>
<script setup lang="ts">
// 3.上面的写法太笨拙, 使用响应式语法糖 解构 + defineProps
const {money,car = "麻喇沙蒂"} = defineProps<{
    money:number
    car?:string
}>()
// 默认值没有显示   需要显示的选择开启

// 子传父
// const emit = defineEmits(['changeMoney','changeCar'])

const emit = defineEmits<{
    (e:'changeMoney',money:number):void
    (e:'changeCar',car:string):void
}>()
const changeMoney=()=>{
  emit('changeMoney',10)
}
</script>
ref的TS写法

ref()会隐式的依据数据推导类型

1.简单数据类型

推荐使用类型推导

复制代码
// const money =ref(10)
const money =ref<number>(10)
2.复杂数据类型

指定泛型

复制代码
// 类型别名--单项类型
type Todo = {
  id:number
  name:string
  done:boolean
}
const list = ref<Todo[]>([])
/**
 * 复杂数据 --后台返回数据,默认值是空,无法进行类型推导
 [
  {id:1,name:"zs",done:true},
  {id:2,name:"ls",done:false}
 ]
 */

setTimeout(()=>{
  list.value =[
  {id:1,name:"zs",done:true},
  {id:2,name:"ls",done:false}
  ]
},1000)
reactive的TS写法

reactive()也会隐式的依据数据推导类型

1.默认值属性是固定的

推荐使用类型推断

复制代码
// 默认值属性是固定的 --类型推断
const book =reactive({title:"vue3学习"})
2.根据默认值推导不出我们需要的类型

推荐使用接口或者类型别名给变量指定类型

复制代码
type Book1 = {
  title:string
  year?:number
}

// 不推荐使用reactive()的泛型参数
const b:Book1 = reactive({title:"hello"})
b.year = 2023
computed和TS

1.computed() 会从计算函数的返回值上推导出类型

复制代码
const count = ref(100)
const doubleCount = computed(()=>count.value *2)

2.可以通过泛型参数显式指定类型

复制代码
const doubleMoney = computed<string>(()=>(count.value*2).toFixed(2))
事件处理与TS
复制代码
<template>
  <div>
    <input type="text" @change="handleChange($event)">
  </div>
</template>
<script setup lang="ts">
// 参数"event"隐式具有"any"类型。
// @change="handleChange($event)" 查看$event类型
// 鼠标放到@change上 查看类型
  const handleChange = (event:Event)=>{
    // event.target 是 EventTarget | null 类型
    // console.log(event.target.value)
    // document.querySelector("input")  查看返回值类型
    console.log((event.target as HTMLInputElement).value)
    // event.target as HTMLInputElement  as限制event.target 的类型是HTMLInputElement
  }
</script>
Template Ref与TS

模板ref需要通过一个显式指定的泛型参数,默认值是null

复制代码
<template>
  <div>
    <input type="text" ref="el">
    <p>123</p>
  </div>
</template>
<script setup lang="ts">
import {ref,onMounted} from 'vue'
const el = ref<HTMLInputElement |null>(null)
document.querySelector('p')

onMounted(()=>{
  // 严格的类型安全  ? 可选链
  // 组件被挂载前,ref的值都是初始的null
  // 也可能是v-if的行为将引用的元素卸载时会设置为null
  el.value?.focus()
})
</script>
非空断言

类型可能是null 或undefined的值

复制代码
<template>
  <div>
    <input type="text" ref="input" value="abc">
  </div>
</template>
<script setup lang="ts">
import {ref,onMounted} from 'vue'

const inp = ref<HTMLInputElement | null>(null)

onMounted(()=>{
  // console.log(inp.value?.value)  可选链
  // 逻辑判断
  // if(inp.value){
  //   console.log(inp.value.value)
  //   inp.value.value = "123"
  // }

  // 一定要确定不为空  ---非空断言
  console.log(inp.value!.value)
  inp.value!.value = "123"
})
</script>
TypeScript类型声明文件
TS类型声明文件是什么

项目中安装的第三方库都是打包后的js代码,但是我们使用的时候却有对应的TS类型提示,为什么?

在第三方库中的js代码都有对应的TS类型声明文件

在ts中以 .d.ts为后缀的文件,我们称之为ts类型声明文件。它的作用是描述js模块内所有导出成员的类型信息

ts中有两种文件类型 .ts文件 .d.ts文件作用是什么?

  • .ts文件
    • 既包含类型信息又可执行代码
    • 可以被编译为js文件,然后执行代码
    • 用途:编写程序代码的地方
  • .d.ts文件
    • 只包含类型信息的类型声明文件
    • 不会生成.js文件,仅用于提供类型信息,在.d.ts文件中不允许出现可执行的代码,只用于提供类型
    • 用途: 为js提供类型信息

所以 .ts是代码实现文件 .d.ts是类型声明文件

内置类型声明文件
复制代码
const arr =[1,2,3]   
//鼠标放在forEach上查看类型   ctrl +鼠标左键  进入 lib.es5.d.ts类型声明文件中
arr.forEach
第三方库类型声明文件

下载axios 查看类型声明文件 node_modules/axios/index.d.ts

自定义类型声明文件
  • 创建types/data.d.ts
  • 创建需要共享的类型,使用export导出
  • 在需要使用共享类型.ts文件中,通过import 导入即可(.d.ts后缀可以省略)

src/types/data.d.ts

复制代码
export type Person = {
    id:number
    name:string
    age:number
}

App.vue

复制代码
import {Person} from './types/data'

const p:Person ={
  id:100,
  name:"Zs",
  age:19
}
相关推荐
不像程序员的程序媛1 分钟前
es按时间 小时聚合
java·前端·elasticsearch
bobz9656 分钟前
为什么 不能在浏览器里直接用 Node.js 专用模块?
前端
萌萌哒草头将军16 分钟前
⚡️⚡️⚡️ 开源了!原来 Vite 加载图片还可以这样啊!🚀🚀🚀
javascript·vue.js·react.js
断竿散人17 分钟前
📏CSS尺寸单位终极手册:从px到fr的完全征服指南
前端·css·响应式设计
Rrvive20 分钟前
Python学习笔记
前端
Aisanyi20 分钟前
【鸿蒙开发】适配深浅色模式
前端·harmonyos
onejason20 分钟前
如何利用 PHP 爬虫按关键字搜索 Amazon 商品
前端·后端·php
咚咚咚ddd21 分钟前
前端基建:使用plus api实现app通知权限管理
前端·javascript·前端工程化
懒猫爱上鱼22 分钟前
Kotlin协程简单介绍
前端
傻梦兽23 分钟前
告别玄学!JavaScript的随机数终于能“听话”了!🎲
前端·javascript·typescript