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

news2025/2/25 9:19:01

文章目录

  • 前言
  • 环境执行依赖node.js
  • 一、基础数据类型
  • 二、任意类型
  • 三、接口和对象类型
  • 四、 数组类型
  • 五、函数重载
  • 六、类型断言
    • 断言
    • 联合类型
    • 交叉类型
  • 七、内置对象-Promise
    • 基础对象
    • DOM和BOM
    • Promise ts化
    • 代码雨案例
  • 八、Class类(派生类和抽象类)
    • 派生类 abstract
    • 抽象类 class
    • Class简单实现vue挂载
  • 总结


前言

话不多说

环境执行依赖node.js

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

一、基础数据类型

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 未声明

//所有类型都可分配给 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. anyunknown
2. Object    //包含下面的
3. Numbel、String、Boolean
4. numbel、stringboolean
5. "asd" 0 false //字面量

三、接口和对象类型

定义接口,以及只读、任意、可有可无、函数
重复命名的接口会自动合并
extends继承接口


//定义接口数据类型
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()

四、 数组类型

数组定义方法

var arr:number[]
var arr3:Array<number>
interface DA{
  [index:number]:number
}
var arr6:number[][][]

举例

//数组内的值只能是数字
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)

五、函数重载

可设置默认参数
参数加?号,为可选参数

//接口定义函数
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')

重载

  • 函数重载 参数类型限制在重载的过程中,参数可选
  • 解决多种数据会复杂性提高代码质量
  • 前两个重载部分,最后声明函数体
/**函数重载 参数类型限制在重载的过程中,参数可选
 * 解决多种数据会复杂性提高代码质量
 * 前两个重载部分,最后声明函数体
 * **/ 
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
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)

联合类型

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

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

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

交叉类型

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

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

七、内置对象-Promise

基础对象

//*内置对象

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等
 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化

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,显示下移
/**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就会执行
//*定义类
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

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

抽象类 class

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

Class简单实现vue挂载

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1158908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

彻底解决使用better-scroll页面不能滚动的问题

better-scroll这个组件不能说有多好&#xff0c;只能说可以拿来用用。但是很多人都碰到了引入这个组件以后&#xff0c;页面反而不能滚动的问题。今天我就来谈谈怎么彻底解决这个问题 首先要谈谈better-scroll页面滚动的原理&#xff1a; 如上图所示&#xff0c;只有当内容高度…

Mac终端学习

命令1&#xff1a;ifconfig 作用&#xff1a;列出本机所有的网络设备以及其上面的配置&#xff0c;主要指的是ip地址和mac地址 其他用法&#xff1a;sudo ifconfig en4 add 10.10.10.12 netmask 255.255.255.0 作用&#xff1a;给en4加入别的网段 其他用法&#xff1a;sudo i…

在跑腿App系统开发中,如何构建系统架构?

1. 前后端分离架构 在跑腿App系统的构建中&#xff0c;采用前后端分离的架构是常见的做法。这意味着前端和后端是独立开发和部署的&#xff0c;它们通过API进行通信。常见的技术栈包括&#xff1a; 前端&#xff1a;使用框架如React、Vue.js&#xff0c;可能还有HTML、CSS、J…

@echo off 的作用

echo off 的作用 表示关闭批处理文件自身的回显&#xff0c;即执行此句之后的命令不会显示出来&#xff0c;只有输出结果会被显示 整体的理解就是 执行的命令不显示了&#xff0c;显示执行命令后的结果 其中&#xff0c; 表示关闭命令回显功能&#xff0c;即命令执行时不在…

MySQL(刷题)

1. 175组合两个表 左外连接 Q&#xff1a; 表: Person---------------------- | 列名 | 类型 | ---------------------- | PersonId | int | | FirstName | varchar | | LastName | varchar | ---------------------- personId 是该表的主键&#…

论文翻译-ImageNet Classification with Deep Convolutional Neural Networks

[toc] 前言 AlexNet是是引领深度学习浪潮的开山之作&#xff0c;即使是我们现在进入了ChatGPT时代&#xff0c;这篇论文依然具有一定的借鉴意义。AlexNet的作者是多伦多大学的Alex Krizhevsky等人。Alex Krizhevsky是Hinton的学生。网上流行说 Hinton、LeCun和Bengio是神经网…

Netty(一)Netty简介与Java的IO模型

Netty&#xff08;一&#xff09;Netty简介与Java的IO模型 1 Netty简介与应用场景 ​ Netty是由JBOSS提供的一个Java开源框架&#xff0c;现为Github上的独立项目。 Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用以快速开发高性能、高可靠性的网络IO程序Nett…

Spring底层原理(四)

Spring底层原理(四) 本章内容 模拟实现Spring中的几个常见BeanFactory后置处理器 常见的BeanFactory后置处理器 GenericApplicationContext context new GenericApplicationContext(); context.registerBean("config",Config.class); context.registerBean(Conf…

算法通过村第十八关-回溯|青铜笔记|什么叫回溯(中篇)

文章目录 前言回溯的核心问题撤销操作解释总结 前言 提示&#xff1a;阳光好的时候&#xff0c;会感觉还可以活很久&#xff0c;甚至可以活出喜悦。 --余秀华 回溯是非常重要的算法思想之一&#xff0c;主要解决一些暴力枚举也搞不定的问题&#xff08;这里埋个坑&#x1f4a3;…

LED显示屏的4种连接方式

全彩LED显示屏是由多块LED模组拼接起来的LED大屏幕&#xff0c;而显示屏模组是由许多的LED灯珠组装起来的。LED显示屏效果好不好&#xff0c;和LED显示屏组装有很大的关系。而显示屏的组装关键在连接方式上&#xff0c;如果连接不好将影响LED显示屏的画面质量&#xff0c;甚至会…

Arduino开发

文章目录 Arduino IDE 的使用1. 使能编译以及烧录的LOG&#xff1a;2. 下载配置3. 下载 Arduino指令程序下载步骤通过下载器下载通过串口下载 关于Arduino IDE工程生成的二进制文件对比Tools-->burn bootloader 和 ArduinoISP例程 的区别自带例程 Arduino IDE 的使用 1. 使…

图数据库Neo4j——SpringBoot使用Neo4j 简单增删改查 复杂查询初步

前言 图形数据库是专门用于存储图形数据的数据库&#xff0c;它使用图形模型来存储数据&#xff0c;并且支持复杂的图形查询。常见的图形数据库有Neo4j、OrientDB等。 Neo4j是用Java实现的开源NoSQL图数据库&#xff0c;本篇博客介绍如何在SpringBoot中使用Neo4j图数据库&…

2023最新全国拉新app推广接单平台合集 地推网推项目平台渠道

平台 ”聚量推客“ 服务商直营的拉新平台 数据和结算都有保障 地推平台承上启下&#xff0c;对上承接甲方项目&#xff0c;对下对接渠道&#xff0c;方便甲方放单又方便渠道统一接单 以下是全国国内十大地推拉新app推广接单平台分享&#xff0c;2023最新全国拉新app推广接单平…

cec2017(MATLAB):星雀优化算法(Nutcracker optimizer algorithm,NOA)

一、星雀优化算法NOA 星雀优化算法(Nutcracker optimizer algorithm,NOA)由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模拟星雀的两种行为&#xff0c;即&#xff1a;在夏秋季节收集并储存食物&#xff0c;在春冬季节搜索食物的存储位置。星雀优化算法(Nutcrack…

C++ Qt 学习(一):Qt 入门

Qt6 安装教程 0. 基础知识 0.1 qmake 和 cmake 对比 qmake&#xff1a;qt 独有的代码构建工具cmake&#xff1a;C 通用的代码构建工具&#xff0c;绝大部分 C 开源项目都使用 cmake 管理代码qt 项目&#xff0c;没有特殊要求&#xff0c;使用 qmake 即可 0.2 Qt 3 个窗口类的…

代码随想录Day34 LeetCode T343整数拆分 T96 不同的二叉搜索树

目录 前言 LeetCode T343 整数拆分 题目思路: 第一步:确定递归数组含义 第三步:初始化dp数组(其实也是为接下来的递推做准备) 第四步:确定遍历顺序(很多情况下是对遍历顺序有要求的) 第五步:打印dp数组(如果遇到错误可以打印一下dp数组看看和我们推理的dp数组有啥不同,错…

0基础学习PyFlink——使用DataStream进行字数统计

大纲 sourceMapSplittingMapping ReduceKeyingReducing 完整代码结构参考资料 在《0基础学习PyFlink——模拟Hadoop流程》一文中&#xff0c;我们看到Hadoop在处理大数据时的MapReduce过程。 本节介绍的DataStream API&#xff0c;则使用了类似的结构。 source 为了方便&…

OSPF高级特性

OSPF高级特性(1) 一、OSPF不规则区域类型 产生原因&#xff1a;区域划分不合理&#xff0c;导致的问题 1、非骨干区域无法和骨干区域保持连通 2、骨干区域被分割 造成后果&#xff1a;非骨干区域没和骨干区域相连&#xff0c;导致ABR将不会帮忙转发区域间的路由信息。非骨干区…

MS3142电机驱动器可兼容LV8548M

MS3142/MS3142S 是一个双全桥电机驱动。可兼容LV8548M&#xff08;功能基本一致&#xff0c;管脚不兼容&#xff09;。电源电压供电范围 4V 到 18V&#xff0c;平均电流 1.1A&#xff0c;电流峰值 1.54A。如果需要更高的电流能力&#xff0c;可以将双全桥并联使用。 四个输入脚…

数据结构预算法--顺序表

1.顺序表 1.1概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 顺序表一般可以分为&#xff1a; 1. 静态顺序表&#xff1a;使用定长数组存储元素。 2. 动态顺序表&#xff1a;使…