初探TS(结合在vue3中的使用)

            <div id="content_views" class="htmledit_views">
                <blockquote> 

TypeScript是拥有类型的JavaScript超集,它可以编译成普通、干净、完整的JavaScript代码。我们可以将TypeScript理解成加强版的JavaScript。

简单来说:Ts是带类型语法的Js; Ts是Js的超集

TS官方网站:https://www.typescriptlang.org/

TS中文官网:https://www.tslang.cn/

一、基础语法

js已有类型:

        基本类型: number, string, boolean, null, undefined, symbol,BigInt

        引用数据类型:对象、数组、函数

ts新增类型:

        联合类型、类型别名、接口、元祖、字面量类型、枚举、void、any、泛型等

(一) 原始类型

1.简单类型 :xx

 
 
  1. let age: number = 18;
  2. let uname: string = "zhangsan";
  3. let flag: boolean = false;
  4. // null和und类型用的比较少
  5. let nullValue: null = null;
  6. let undefinedValue: undefined = undefined;

PS:其实最后.ts转为.js文件时void仍会变为undefined,TS中加上void一般只是为了将函数返回值和其他区分出来。

2.引用类型 :xx[]
a.数组

 
 
  1. let arr1 = [ "a", "b", "c"]
  2. let arr3: number[] = [ 1, 2, 3]
  3. let arr2: string[] = [ "a", "b", "c"]
  4. console. log(arr1, arr2, arr3);
  5. let arr4: Array< string> = [ "ok", "hello"]
  6. console. log(arr4);

思考:数组中是可以存放多种数据类型

        联合类型:|(竖线)在TS中叫做联合类型

        即:由两个或多个其他类型组成的类型,表示可以是这些类型中的任意一种

b.函数

 
 
  1. // 函数 给参数和返回值 指定类型
  2. // 函数声明(具名函数)
  3. function add( a: number, b: number): number {
  4.      return a + b
  5. }
  6. console. log( add( 1, 2));
  7. // 函数表达式(匿名函数)
  8. let add2 = ( a: number, b: number): number => {
  9.      return a + b
  10. }
  11. console. log( add2( 1, 2));
  12. // 箭头函数写法
  13. type AddFn = (a: number, b: number) => number
  14. // 通过类似箭头函数形式的语法为函数添加类型,只适用于函数表达式
  15. let add3: AddFn = (a, b) => {
  16.      return a + b
  17. }
  18. console. log( add3( 3, 3));

可选参数?

使用 ? 将参数标记为可选

const fn = (n?: number) => {

}

fn()

fn(1)


函数返回值:

在js中默认返回值是und,在ts中默认返回的是void

如果指定返回值类型是 undefined 那返回值一定是 undefined


 
 
  1. // void和undfined类型
  2. // 如果函数没有返回值,定义函数类型时返回值的类型为void
  3. const say = ( ) => {
  4.      // console.log('hello ts~');
  5. }
  6. console. log( say());
  7. console. log( typeof say());
  8. const say2 = (): void => {
  9.      // console.log('hello ts~');
  10. }
  11. console. log( say2());
  12. console. log( typeof say2());
  13. // 区分:在js中默认返回值是und,在ts中默认返回的是void
  14. // 如果指定返回值类型是 undefined 那返回值一定是 undefined
  15. const say3 = (): undefined => {
  16.      // console.log('hello ts~');
  17. }
  18. console. log( say3());
  19. console. log( typeof say3());
c.对象

 
 
  1. // 空对象
  2. let obj1 = {}
  3. let obj2: {} = {}
  4. // 指定对象里面的属性和方法
  5. // let obj4: { name: string, say(): void } = {
  6. let obj4: { name: string; say(): void } = {
  7.      name: "wc",     // 对象里面写方法的两种写法    // say():void    say: () => void
  8. }
  9. // 竖着写 可以换行
  10. let obj5: {
  11.      // name: string,
  12.      name: string;
  13.      say(): void
  14. } = {
  15.      name: "wc",
  16.      say( ) { }
  17. }

(二) 类型别名 type

给某个指定类型起别名

定义类型别名,遵循大驼峰命名,类似于变量

        什么时候是用类名别名?

        当同一类型(引用)被多次使用,可以通过类型别名简化


 
 
  1. // 语法:type 类型别名=具体类型
  2. type A = ( string | number)[]
  3. let arr9: A
  4. arr9 = [ 1, "a", 3]
交叉类型 &

 
 
  1. // type  交叉类型
  2. type APoint2D = {
  3.      x: number,
  4.      y: number
  5. }
  6. type APoint3D = APoint2D & {
  7.      z: number
  8. }
  9. let o: APoint3D = {
  10.      x: 1,
  11.      y: 2,
  12.      z: 3
  13. }

(三) 接口 interface (可继承extends)

interface 后面跟的是接口名称

注意:接口的每一行只能有一个属性或者一个方法 每一行不需要加分号

interface Person {

    name: string

    age: number

    say: () => void

}


 
 
  1. let p: Person = {
  2.      name: "wangcai",
  3.      age: 18,
  4.      say( ) { }
  5. }
  6. console. log(p);
  7. // 接口是可继承的
  8. // 2D坐标
  9. interface Point2D {
  10.      x: number
  11.      y: number
  12. }
  13. let p2: Point2D = {
  14.      x: 1,
  15.      y: 2
  16. }
  17. console. log(p2);
  18. // 如何实现继承?
  19. // 使用extends实现接口继承,达到类型复用
  20. // 继承后 接口A 拥有了接口B的所有属性和函数的类型声明 interface Point3D extends Point2D {    z: number}
  21. let p3: Point3D = {
  22.      x: 1,
  23.      y: 2,
  24.      z: 3
  25. }

(四)interface和type的区别

1.type是起别名,interface 是自己发明类型 自定义类型
 


 
 
  1. // 会报错
  2. // type APerson = {
  3. //     name:string
  4. // }
  5. // type APerson = {
  6. //     age:number
  7. // }
  8. interface Person1 {
  9.      name1: string
  10. };
  11. interface Person1 {
  12.      age1: number
  13. };
  14. // 类型合并
  15. const c1: Person1 = {
  16.      name1: "wc",
  17.      age1: 18
  18. }

2.type不可以重复定义,interface可以重复定义会合并

3.type支持对象类型和其他类型,interface只支持对象类型

4.type复用:交叉类型 &,interface复用:可以继承 extends

二、ts在vue3中的使用

(一)ref和ts

// 手动指定类型

const count =ref<number>(0)


 
 
  1. <template>
  2.      <div>{{ count }} </div>
  3.      <ul>
  4.        <li v-for="item in list" :key="item.id">
  5.         {{ item.name }}
  6.        </li>
  7.      </ul>
  8. </template>
  9. <script setup lang="ts">
  10. import { ref, reactive } from "vue"
  11. // 手动指定类型const count =ref<number>(0)
  12. // 自动类型
  13. const count1= ref( 0)
  14. type ToDoItem={
  15.    id:number;
  16.    name:string;
  17.    done:boolean
  18. }
  19. // [{},{},{}]
  20. const list=ref< ToDoItem[]>([])
  21. setTimeout( ()=>{
  22.   list. value=[
  23.   { id: 100, name: "吃饭", done: false },
  24.   { id: 101, name: "睡觉", done: false },
  25.   ]
  26. }, 1000)
  27. </script>

(二)reactive和ts

type Book={

title:string;

year?:number

}

const book:Book=reactive({

title:"ts语法基础"

})


 
 
  1. <template>
  2.     {{ book.title }} -- {{ book.year }}
  3. </template>
  4. <script setup lang="ts">
  5. import { ref, reactive } from "vue"
  6. // 1.手动指定类型
  7. type Book={
  8.    title:string;
  9.   year?:number
  10. } const book: Book= reactive({
  11.    title: "ts语法基础"
  12. })
  13. book. year= 2023
  14. // 2.自动类型推导
  15. const Book= reactive({ title: "ts语法基础2"})
  16. </script>

(三)computed和ts

const doubleCountB = computed<string(() => (count.value * 2).toFixed(2))


 
 
  1. <template>
  2.   {{ count }} -- {{ doubleCount }} -- {{ doubleCountB }}
  3.   {{ typeof count }} -- {{ typeof doubleCount }} -- {{ typeof doubleCountB }}
  4. </template>
  5. <script setup lang="ts">
  6. import { ref, computed } from "vue"
  7. const count = ref( 205)
  8. // 1.自动类型推导
  9. // toFixed(2)保留2位小数,且返回值类型为string
  10. const doubleCount = computed( () => (count. value * 2). toFixed( 2))
  11. // 2.指定计算属性的类型
  12. const doubleCountB = computed<string>( () => (count. value * 2). toFixed( 2))
  13. </script>

(四)defineprops和ts(父传子)

defineProps<{

money:number;

car?:string

}>()

Child.vue


 
 
  1. <template>
  2.      <div class="">
  3.        <p>{{ money }} </p>
  4.        <p>{{ car }} </p>
  5.      </div>
  6. </template>
  7. <script setup lang="ts">
  8. // vue3基本写法
  9. // defineProps({
  10. //     money:{
  11. //         type:Number,
  12. //         required:true
  13. //     }
  14. // })
  15. // ts基本语法
  16. // defineProps<{
  17. //     money:number;
  18. //     car?:string
  19. // }>()
  20. // ts+有默认值的写法
  21. withDefaults(
  22.     defineProps<{
  23.          money:number;
  24.         car?:string
  25.     }>(),{
  26.          money: 666,
  27.          car: "xiaomi"
  28.     }
  29. )
  30. </script>

App.vue


 
 
  1. <template>
  2.   <div>
  3.    <!-- 父传子 -->
  4.    <Child :money="money"> </Child>
  5.   </div>
  6. </template>
  7. <script setup lang="ts">
  8. import { ref} from "vue"
  9. import Child from "./components/Child.vue"
  10. const money= ref( 666)
  11. const car= ref( '大众')
  12. </script>

(五)defineEmits和ts(子传父)

const emit =defineEmits<{

(e:"changeMoney",money:number):void;

(e:"changeCar",car:string):void;

}>()

Child.vue


 
 
  1. <template>
  2.      <p>{{ money }} </p>
  3.      <button @click="emit('changeMoney', 800)">改money </button>
  4.      <p>{{ car }} </p>
  5.      <button @click="emit('changeCar', '宝马')">改car </button>
  6. </template>
  7. <script setup lang="ts">
  8. // vue3基本写法
  9. // const emit = defineEmits(["changeMoney", "changeCar"])
  10. // ts写法
  11. defineProps<{
  12.    money: number;
  13.   car?: string;
  14. }>()
  15. const emit =defineEmits<{
  16.     ( e: "changeMoney", money:number): void;
  17.     ( e: "changeCar", car:string): void;
  18. }>()
  19. </script>

App.vue


 
 
  1. <template>
  2.   <!-- 子传父 -->
  3.   <Child
  4.   :money= "money"
  5.   :car= "car"
  6.  @ change-money= "money=$event"
  7.  @ change-car= "car=$event"
  8.  > </Child>
  9. </template>
  10. <script setup lang="ts">
  11. import { ref} from "vue"
  12. import Child from "./components/Child.vue"
  13. const money= ref( 666)
  14. const car= ref( '大众')
  15. </script>

(六)事件处理和ts :Event

as 断言​​​​​​​

e:Event


 
 
  1. <template>
  2.      <input type="text" @change="handleChange" value="hi">
  3. </template>
  4. <script setup lang="ts">
  5. // 不处理类型
  6. // const handleChange=(e)=>{
  7. //     console.log(e.target.value)
  8. // }
  9. const handleChange=( e:Event)=>{
  10.      // as 断言
  11.      // e.target 事件源
  12.      console. log((e. target as HTMLInputElement). value);
  13. }
  14. </script>

(七)ref写在标签上获取 :HTMLInputElement

const input = ref<HTMLInputElement | null(null)


 
 
  1. <template>
  2.      <div>
  3.          <input type="text" ref="input">
  4.      </div>
  5. </template>
  6. <script setup lang="ts">
  7. import { onMounted, ref } from 'vue'
  8. const input = ref< HTMLInputElement | null>( null)
  9. // 页面加载完毕调用钩子函数
  10. onMounted( ()=>{
  11.     input. value?. focus()
  12. })
  13. </script>

(八)非空断言 !

// ! 非空断言(方法一)

input.value!.value = "456" //可以赋值

// 类型守卫(方法二)

if (input.value) {

input.value.value = "789" //可以赋值

}


 
 
  1. <template>
  2.      <div>
  3.          <input type="text" ref="input" value="123">
  4.      </div>
  5. </template>
  6. <script setup lang="ts">
  7. import { onMounted, ref } from 'vue'
  8. const input = ref< HTMLInputElement | null>( null)
  9. // 页面加载完毕调用钩子函数
  10. onMounted( () => {
  11.      // 自动获取焦点
  12.     input. value?. focus()
  13.      // 使用ES6 输入框没有获取到,对于可能出现null,
  14.      console. log(input. value?. value);
  15.      // ?可选参数 可选链  报错 因为不能赋值
  16.      // input.value?.value = "456"
  17.      // ! 非空断言(方法一)
  18.     input. value!. value = "456" //可以赋值
  19.      // 类型守卫(方法二)
  20.      if (input. value) {
  21.         input. value. value = "789" //可以赋值
  22.     }
  23. })
  24. </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值