(一)、ts 基础类型 及class类举例字符雨和实现vue的挂在#app

文章目录


前言

话不多说

环境执行依赖node.js

ts 复制代码
npm i @types/node -g
npm i ts-node --g
tsc --init //曝光严格模式ts.config.json

一、基础数据类型

ts里变量名不能重复

ts 复制代码
//string
var a:string = "string"

//numbel
var a1:number = 1

//boolean
var a2:boolean = true

//null
var a3:null = null

//undefined
var a4:undefined = undefined

//void 没有返回值的函数
var a5 = ():void=>{
    return
}

二、任意类型

any 所有类型

unknown 未声明

ts 复制代码
//所有类型都可分配给 any所有 | unknown未声明   unknown更加安全、严格
//unknown 可赋值对象只有 unknown any 

//没有这个属性 不会报错
let b:any={a:"sada"}
console.log(b.a);

//如果是unknow 是不能调用属性和方法
let b1:unknown={a1a:"sada"}
//console.log(b1.a1a);//报错



类型分配优先级
1. any 、 unknown
2. Object    //包含下面的
3. Numbel、String、Boolean
4. numbel、string、 boolean
5. "asd" 0 false //字面量

三、接口和对象类型

定义接口,以及只读、任意、可有可无、函数

重复命名的接口会自动合并

extends继承接口

ts 复制代码
//定义接口数据类型
interface T{
  //readonly 只读属性
  readonly a:string,
  //? 可以没有这个属性
  b?:number,
  //[propName: string] 定义任意属性
  [propName: string]:any
  //定义函数
  cb:()=>void
}
//重名的会合并
interface T{
  d:undefined
}
//S继承T的数据类型
interface S extends T{
  c:true,
}
const dataT:S={
  a:'asdasd',
  b:0,
  c:true,
  d:undefined,
  s:true,
  cb:()=>{
    console.log(dataT.b);
  }
}
dataT.cb()

四、 数组类型

数组定义方法

ts 复制代码
var arr:number[]
var arr3:Array<number>
interface DA{
  [index:number]:number
}
var arr6:number[][][]

举例

ts 复制代码
//数组内的值只能是数字
var arr:number[] = [1,2]

//数组内的值只能是字符串
var arr1:string[] = ['1','2']

//数组内的值为任意值
var arr2:any[] = ['1',1, true]

//泛型
var arr3:Array<number>=arr
var arr4:Array<string>=arr1

//接口描述数组
interface DA{
  [index:number]:number
}
var aar5:DA=[1,2,3,4]

//多维套娃
var arr6:number[][][]=[[[1]]]

//内置方法把传入的值变为一个类数组
function Arr(...args:any){
    let a:IArguments = arguments
    console.log(a);//[Arguments] { '0': '11', '1': 22, '2': true }
    
}
Arr('11',22,true)

五、函数重载

可设置默认参数

参数加?号,为可选参数

ts 复制代码
//接口定义函数
interface add{
    (num:number,data:number):number
}
//接口定义对象
interface User{
    admin:string,
    name:number
}

//函数传参一一对应
//声明 ? 后为可选参数
//参数默认值 = 声明 
const fn =(name:string='1',data?:number)=>{
  return name + data
}

fn('12',4)

const A:add=(num,num2):number=>{
    return num + num2
}

A(1,2)

const aaa=(user:User):User=>{
    return user
}

aaa({admin:'sss',name:23})

//定义剩余函数
const fns=(async:Array<number>,...item:string[]):any[]=>{
   return item
}

let asy:Array<number>=[1,2,3]
fns(asy,'3','4','5','6')

重载

  • 函数重载 参数类型限制在重载的过程中,参数可选
  • 解决多种数据会复杂性提高代码质量
  • 前两个重载部分,最后声明函数体
ts 复制代码
/**函数重载 参数类型限制在重载的过程中,参数可选
 * 解决多种数据会复杂性提高代码质量
 * 前两个重载部分,最后声明函数体
 * **/ 
function tion(params:number):void
function tion(params:string,params2:number):void
function tion(params:any,params2?:any):void{
    console.log(params,params2);
}

tion(12)
tion('123',23)

六、类型断言

  • 联合类型 | 交叉类型 & 与js的或非差不多
  • 断言as,ts识别不了时需要断言数据是什么类型

断言

  • 类型断言 as
  • 语法:  值 as 类型  或  <类型>值 value as string value
ts 复制代码
interface A{
    run:string
}
interface B{
    build:string
}

const yu=(type:A | B ):string=>{
    //添加不存在的属性用 any断言
    (type as any).abc=123
    return (type as B).build
}
yu({build:'sda'})


// let names = 'sda' as const
// names = 'asd'

let as1=[1,2] as const
const as2=[1,2]

// as1.unshift(30) //断言 as const 后数组为只读
as2.unshift(3)
console.log(as1,as2);


//断言在编译后会删除,不具备影响
function sa(tru:any):boolean{
    console.log(tru as true);//返回 23
    return tru as true
}

sa(23)

联合类型

  • 使用 | 管道符连接
  • 表示 可以是这些类型中的任何一个值
ts 复制代码
//联合类型

var Phone:number | string='1234-23423'
Phone=1232342

function Data(stage:boolean | number):boolean{
    return !!stage
}
Data(true)
Data(1)

交叉类型

  • 交叉类似表示需要满足多个型的条件
  • 交叉类型使用 & 符号
ts 复制代码
//交叉类型

interface Man{
    number:number
}
interface Mta{
    bable:string
}
const xiao =(data:Man & Mta)=>{
    // console.log(data);
    
}
xiao({number:12,bable:'32'})

七、内置对象-Promise

基础对象

ts 复制代码
//*内置对象

let yes:Boolean =new Boolean()     //?   [Boolean: false]

let yes1:Number =new Number(2)     //?   [Number: 2]

let yes2:String =new String(1)     //?   [String: '1']

let yes3:RegExp =/^123/     //?   /^123/

let yes4:Date = new Date()     //?   2023-11-01T02:15:13.867Z

let yes5:Error = new Error("error")     //?   Error: error

DOM和BOM

  • 元素的内置定义类型:HTMLElement、HTMLTitleElement等
ts 复制代码
 let ye:HTMLElement = document.body
 //NodeList列表相当于forEach循环div
 let ye1:NodeListOf<HTMLDivElement | HTMLTitleElement> = document.querySelectorAll('div title')
 let sad:HTMLElement=document.querySelector('div') as HTMLDivElement
 document.addEventListener('click',(e:MouseEvent)=>{
 })

Promise ts化

ts 复制代码
interface TY {
  code:number,
  msg:string,
  data:object
}

let promise:Promise<TY> = new Promise((r,e)=>{
  r({
    code:200,
    msg:'',
    data:{}
  })
  // e('error:')
})

promise.then(res=>{
 console.log(res);
 
}).catch(err=>{
  console.log(err);
  
})
  • 转js提示错误时,tsc --target es6 test.ts

代码雨案例

  • 书写逻辑
  • 创建一个画布,
  • 封装函数,创建透明背景,每次执行会加深颜色,设置满屏到的canavs,文字颜色,利用ctx.fillText设置X、Y轴的数组,铺满width,每次每次执行arrs数组Y轴坐标加10,显示下移
ts 复制代码
/**tsc --init    tsc -w       
 * tsc 文件名     // //把ts转换成js引入html
*/

let canav = document.querySelector('#myCanvas') as HTMLCanvasElement

//创建画布
let ctx=canav.getContext('2d') as CanvasRenderingContext2D

let str = 'ABCDEFGHMNOPQRSTUVWXYZ0123456789'.split('')

//设置满屏宽高
canav.width = screen.availWidth
canav.height = screen.availHeight


//数组填充  fill填充      Math.ceil向上取整
let arrs =Array(Math.ceil(canav.width / 1)).fill(0)//实现字符向下移动的逻辑,fill(0)赋值

/** 每执行一次,半透明背景叠加,逐渐变深,形成字符雨的效果*/
let main =()=>{
  //ctx重上到下执行,切分开,所以fillStyle是分别填充背景和text
  ctx.fillStyle='rgba(0,0,0,0.1)'//设置背景色
  ctx.fillRect(0,0,canav.width,canav.height)//设置满屏canavs
  ctx.fillStyle='#0f0'//设置文字颜色
  console.log(arrs);
  arrs.forEach((item,i)=>{
    ctx.fillText(str[Math.floor(Math.random() * str.length)],i*10,item) //内容、x、y     //设置最上方的固定一排,并随机内容
    arrs[i]=item>=canav.height ||item> 10000 * Math.random() ? 0 : item + 10  //arrs数组加每次10,实现下移动 设置下次arrs的item为+=10 大于随机数后从0开始
    
  })
}
 setInterval(main,100)//定时触发

八、Class类(派生类和抽象类)

  • public num:string //默认的 内部外部都可访问
  • private num1:string //只能在内部访问 私有变量
  • protected num2:string //只能在内部和子类中访问
  • static nb:string //只能在外部调用类.nb(Person1.nb) 静态属性方法
  • constructor函数是初始化函数调用class就会执行
ts 复制代码
//*定义类
class Person{
  num:string
  constructor(num:string){
      this.num=num
  }
  run(){

  }
}


//*类的修饰符
class Person1{
  public num:string      //默认的 内部外部都可访问
  private num1:string    //只能在内部访问  私有变量
  protected num2:string  //只能在内部和子类中访问
  static nb:string       //只能在外部调用类.nb(Person1.nb) 静态属性方法
  constructor(num:string,num1:string,num2:string){
      this.num=num
      this.num1=num1
      this.num2=num2
  }
  static run(){         //函数添加后两个静态函数可以this.调用,外部类名可.出
    return console.log('run');
    
  }
}

class Person2 extends Person1{
  constructor(){
    super('num','num1','num2')
      this.num2=this.num
  }
  static run1(){
     return this.run()
     
  }
}
// Person1.nb
// Person2.nb
// Person2.run1()

//* interface 定义 类

interface Per{
  name1:string
  name2:number
  ser():void
}

interface Per1{
  name3:string
  name4:number
}

//抽像类 不可实例化,需要借助派生类
abstract class Pe{
  name5:string
  constructor(){
    this.name5='name'
  }
}

//派生类 继承 使用接口
class Pe1 extends Pe implements Per{
    name1:string
    name2:number
    constructor(){//类的方法
      super()
      this.name1='1'
      this.name2=0
    }
    ser(){
    }
}

派生类 abstract

  • 借助抽想类才能实例化
ts 复制代码
//抽像类 不可实例化,需要借助派生类
abstract class Pe{
  name5:string
  constructor(){
    this.name5='name'
  }
}

抽象类 class

  • implements
  • extends 继承实例或派生
ts 复制代码
//派生类 继承 使用接口
class Pe1 extends Pe implements Per{
    name1:string
    name2:number
    constructor(){//类的方法
      super()
      this.name1='1'
      this.name2=0
    }
    ser(){
    }
}

Class简单实现vue挂载

ts 复制代码
interface Option{
  el:string |HTMLElement
}

interface VueCls{
  init():void,
  option:Option
}

interface Vnode {
  tag: string
  text?: string
  props?: {
      id?: number | string
      key?: number | string | object
  }
  children?: Vnode[]
}

class Dom{
   constructor(){
   }
   //创建dom
   createElement(el:string):HTMLElement{
      return document.createElement(el)
   }
   //设置dom的text
   setText(el:HTMLElement,text:string|null){
      el.textContent=text
   }
   //生成dom元素
   render(createElement:Vnode):HTMLElement{
     //原生渲染dom, 挂载到id app上
     const el =this.createElement(createElement.tag)
         el.innerText=createElement.text as string
     if(createElement.children && Array.isArray(createElement.children)){
       createElement.children.forEach(item=>{
           const child = this.render(item)
           this.setText(child,item.text?? null)
           el.appendChild(child)
       })
     }else{
      this.setText(el,createElement.text?? null)
     }
     return el
   }
}

//继承Dom派生类
class Vue extends Dom implements VueCls{
   option: Option;
   constructor(option:Option){
    super()
    this.option=option
    this.init()
   }
   init(){
      let app = typeof this.option.el == 'string' ? document.querySelector(this.option.el) :this.option.el
      let data={
        tag:'div',
        text:"asd",
        children:[{
          tag:'div',
          text:"子"
        }]
      }   
      app?.appendChild(this.render(data))
      
      this.mount(app as HTMLDivElement)
   }
   mount(app:HTMLDivElement){
    return document.body.append(app)
   }
}

//调用方法
Vue

总结

ts基础笔记1

相关推荐
mldong2 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排2 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60613 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角4 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!4 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰4 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi6 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen6 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马7 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu7 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss