TypeScript

撒么快思晨

  • TS是什么?——js的超集(js有的它都有,完全兼容)、为js添加了类型支持。js弱类型动态语言,java强类型静态语言。
  • 弱类型:声明变量无需指定类型。强类型:声明变量时必须指定类型。
  •   为什么要用ts? ———好处:找错误(js执行才会发现错误,ts写的时候就能发现),有提示(. 会有很多方法)。

撒么工具包

  • typescript:npm i -g typescript  (使用:tsc -v 查看ts的版本,查看是否安装成功。)

创建基于TS的vue项目

npm create vite 

TS基础

类型注解

let age:number = 18
  • :number就是类型注解,为变量添加类型约束。约定了什么类型就是什么类型,就只能给变量赋值该类型的值,否则就会报错。

TS类型

  • js已有的

基础类型:number / string / boolean / null / undefined

复杂类型:数组、函数、对象

声明数组的两种方式:

let arr:number[] = []  //number类型的数组

let arr1:Array<number> = [1,2,3]
  • TS新增的(函数、数组、对象都是js )

联合类型

        联合类型—— :|(或,或的优先级较低,需要用()包裹提升优先级)

        需求:希望数组里面可以存数字或字符串

  •  let arr:(number|string) [] = [1,2,3,'1']

  •   一旦使用联合类型,说明arr中存储的既可能是number 也可能是string,所以只能.出来共有的方法


自定义类型(类型别名)

需求:希望N个数组里面可以存数字或者字符串

type ArrType = (number|string) []

let arr1:ArrType = [1,2,'2']

函数类型

   需求:设置函数的参数类型(number) + 返回值类型

  • 在js中可以用下面的方式定义函数,ts不可以哦,因为ts必须在传参的时候定义参数的类型而返回值会自动推断类型

  • function del(a:number,b:number){
        return a+b
    }
  • 函数别名:
  • type Fun = (a:number,b:number) => number
    
    const fb:Fun = (a,b) => {
        return a+b
    }
    
  • 类型别名 通常是给箭头函数 / 函数表达式使用,不会给函数声明使用

void

需求:定义一个打印文本的函数 不需要返回值

如果函数没有返回值(js通常是undefined),但ts给我们的类型推断通常为void

在ts中写 :undefined  设置返回值类型的意思是  必须返回一个undefined


可选参数:?

const F = (name?:string,age?:number):void => {
    console.log(name,age)
}
F('ju')

注意:必选参数不能在可选参数后面


对象类型

let obj:{
    name:string,
    age:number,
    sayHi:(concent:string)=>void
    sai(name:string):void
}={
    name:'ju',
    age:28,
    sayHi(concent){
        console.log(concent)
    }
    
}

或

type Person ={
    name:string,
    age:number,
    sayHi:(concent:string)=>void
}
let obj:Person ={
    name:'ju',
    age:28,
    sayHi(concent){
        console.log(concent)
    }
}

接口

作用:给对象约束属性和方法

 interface Persons {
    name:string
    age:number
    sayHi:()=>void
 }
 const p :Persons ={
    name:'ju',
    age:12,
    sayHi(){

    }
 }

interface 接口名{
    属性名:类型
}
接口和type的区别:
  • 相同点:都可以给对象指定类型。
  • 不同点:接口只能为对象指定类型,type不仅可以为对象指定类型 实际可以为任意类型指定别名。

注意:能用type 就用type!!!!因为灵活!!!

接口的继承

Students具备Persons 的所有 属性方法、实现接口复用。

 interface Persons {
    name:string
    age:number
    sayHi:()=>void
 }
 const p :Persons ={
    name:'ju',
    age:12,
    sayHi(){

    }
 }
 interface Students extends Persons {
    score:number
    sleep:()=>void
 }
const pp:Students ={
    name:'jj',
    age:18,
    sayHi(){

    },
    score:100,
    sleep(){
        
    }

}
扩展题:type 如何 和 interface 一样实现继承效果?
  • & 与连接符:既要满足前面的也要满足后面的
  • | 或连接符:满足其中一个即可
type pe ={
    name:string
    age:number
}
type pp={
    score:string
} & pe

元祖

元祖:限定数组的固定类型和数据(在地图中使用经纬度坐标来标记位置信息)

let arr:[number,number] =[1.22222,1.223444]
只能有两位

字面量类型

使用场景:比如游戏中的上下左右 方向

type direction = '上'|"下"|"左"|"右"
function a(direction:direction){

}
a("上")

枚举

类似于字面量

// type direction = '上'|"下"|"左"|"右"

默认没有值de:
enum direction{
上,下,左,右
}
function a(direction:direction){
console.log("枚举值",direction)
}
a(direction.上)
a(direction.下)
a(direction.左)
a(direction.右)

这样给值:
enum direction{
上=1,下=2,左=3,右=4
}

枚举可以通过键找值,也可以通过值找键:
direction[1]  就是上 

枚举如果没有值 默认从0开始

any类型

当值得类型为any时,可以对该值进行任意操作,并且不会有代码提示(所以不推荐)

其他隐式为any的情况:

  • 声明变量不提供类型也不提供默认值 
  • 函数参数不加类型

类型断言

强行指定获取到的结果类型:as

总结:当函数获取到的结果类型较为宽泛时,我们又知道具体类型,就可以使用断言强行指定类型

泛型

在调用函数是传入泛型指定的具体类型

<T> 在声明泛型
val:T 使用泛型


function getVal<T>(val:T){
    return val
}
getVal<number>(123)
getVal<string>('abc')

简化泛型函数调用:

function getVal<T>(val:T){
    return val
}
getVal(123)
getVal('abc')

类型约束

e.g:创建描述约束的接口,该接口要求提供length属性,通过extends关键字使用该接口,为泛型(类型变量)添加约束,该约束表示:传入的类型必须具有length属性

注意:传入的实参(如:数组)只要有length属性即可(类型兼容性)

// 定义接口
interface Ilength {
    length:number
}
// 添加约束
function getLen<L extends Ilength>(val:L){
console.log(val.length);

}

相关推荐

  1. typeScript

    2024-07-15 22:00:04       41 阅读
  2. TypeScript

    2024-07-15 22:00:04       36 阅读
  3. TypeScript

    2024-07-15 22:00:04       27 阅读
  4. TypeScript

    2024-07-15 22:00:04       20 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 22:00:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 22:00:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 22:00:04       57 阅读
  4. Python语言-面向对象

    2024-07-15 22:00:04       68 阅读

热门阅读

  1. AWS云计算实战:电商平台发卡机器人开发指南

    2024-07-15 22:00:04       24 阅读
  2. lua 实现一个 StateMachine状态机

    2024-07-15 22:00:04       20 阅读
  3. vim全局替换、添加新行、同时注释多行

    2024-07-15 22:00:04       20 阅读
  4. 算法题——冒泡排序

    2024-07-15 22:00:04       16 阅读
  5. 构建加速秘籍:精通Gradle构建启动参数

    2024-07-15 22:00:04       20 阅读
  6. FATE Flow 源码解析 - 资源分配流程

    2024-07-15 22:00:04       18 阅读
  7. 每天一个数据分析题(四百二十九)- 假设检验

    2024-07-15 22:00:04       20 阅读
  8. Redis6.2.1版本集群新加副本

    2024-07-15 22:00:04       24 阅读
  9. Linux-线程同步(条件变量、POSIX信号量)

    2024-07-15 22:00:04       21 阅读