TypeScript 语法 + 工具封装

环境配置

安装 npm install typescript -g
查看版本 tsc --version

1.初识typescript

邂逅typescript,typescript的基本使用

新建ts 文件 (记得导出)
typescript 定义时可指定 变量类型 在名称后面加引号 和 类型
格式为 let 名称: 类型 = 值 (例如: let name:string = ‘张三’)
类型 string 首字母为小写

let message: string = '张三'
console.log(message, '------')
let name = 123
name = 66
export {}

运行 tsc xxxx 并在html中引入

<html><head></head><body><h1>哈哈哈哈</h1></body><script src="xxxxx"></script>
</html>

typescript的类型推导

在 ts 中不定义 类型 会默认赋值 值的类型
例如 let name = 123 则默认 name的类型是 number
但 使用 const 赋值时 会默认返回 字面量类型
例如 const name = 1.88 则默认 name的类型是 1.88 等同于 const name:1.88 = 1.88
所以:let 推导出来的是通用类型,const推导出来的是字面量类型

2.typescript的数据类型

js中的类型

Array

//明确的指定<数组>的类型注解:两种写法
// 1.string[]: 数组类型,并且数组中存放的是字符串
let list: string[] = ['张三','李斯']
list.push('王五')
//2. Array<number> 数组类型,并且数组中存放的是number
let arr:Array<number> = [0,1,2]
arr.push(9)
export {}

Object

let info: {name: stringage: number
} = {name: '青子',age: 18
}
console.log(info.name)
// 可以通过 type 定义
type infos = {names: stringages: number
}
let info1: infos = {names: '陆景',ages: 18
}
console.log(info1.ages)
export { }

使用

// z? 为可传值,不是必传
type obj = {x: numbery: numberz?: number
}function getNum(val: obj) {return val.x + val.y
}getNum({ x: 1, y: 2 })export { }

函数的类型
参数

function getInfo(num1:number,num2:number){return num1 + num2
}
getInfo(5,6)
export {}

返回值

//返回值可以明确指定,也可以自动进行推导
function getInfo(num1:number,num2:number):number{return num1 + num2
}
let val = getInfo(5,6)
console.log(val)
export {}

匿名参数

const names = ['abc','cds','opp']
//匿名函数最好不要添加注解类型
names.forEach(function(item,index,arr){console.log(item,index,arr)
})
export {}

使用

type val = {time: numbertext: string
}
function getList(value: string) {let arr: val[] = []arr.push({ time: 111, text: '你好' })return arr
}let list = getList('oioioio')
list.map(item => {console.log(item.time, item.text)
})
export {}

ts中的类型

any

//any表示不限制任意类型
let id: any = 44
id = "text"
id = []
console.log(id.length)
export { }

unknown

let foo:unknown = 'pp'
foo = 123
//要求必须进行类型的校验
if( typeof foo === 'string'){console.log(foo.length)
}
export{}

void

// 没有返回值的时候
function foo(num:number,num1:number):void{console.log(num+num1)
}
export {}

never

// 一般情况下不会使用never ,never表示不会返回任何值
// 封装工具的时候可以使用
function getFoo(message: number | string) {switch (typeof message) {case "string":console.log(message.length)breakcase "number":console.log(Number(message))breakdefault:const check: never = message}
}
getFoo(123)
export{}

tuple

//元组类型,元组数据结构中可以存放不同的数据类型,取出来的item也是有明确的类型
const info:[string,number,number] = ['zs',18,1.88]
const value = info[1]
export{}

3. typescript的语法细节

联和类型的使用

//有的情况下一个值可能是number 也可能是string 类型,这种情况下就可以使用联合类型
let id: number | string = 123
id = 'aaa'
//范围缩小
if(typeof id === 'string'){console.log(id.length)
}
export{}

类型别名的使用type

// type 类型的别名
type val = number | string
let id: val = '123'
id = 456
export { }

接口声明的使用interface

//type 直接赋值
type info = {x: numbery: numberz?: number
}
//interface 声明
interface info1 {x: numbery: numberz?: number
}
function getFoo(val:info1){return val.x + val.y
}
getFoo({x:1,y:2})
export{}

别名和接口的区别

//区别一:type类型使用范围更广,接口类型只能用来声明对象
type info = number
type info1 = string[]
//区别二 : interface 可以多次声明,可以继承
interface Ikun {x: numbery: number
}
interface Ikun {z?: number
}
export { }

交叉类型的使用

//交叉类型,满足两个或多个条件
interface info {name: string,age: number
}
interface Ikun {running: () => void
}
type NewType = info & Ikun
let list: NewType = {name: '张三李斯',age: 15,running: function () {return '你干嘛!哎哟'}
}
export {}

类型断言

// 获取DOM 元素  <img calss="img"/>
//使用类型断言
//类型断言规则:断言只能断言成更加具体的类型,或者不太具体(any/unknown)类型
const imgEl = document.querySelector(".img") as HTMLImageElement
imgEl.src = "xxx"
imgEl.alt = 'yyy'
export {}

非空类型断言

interface info {name:stringage:18friend?:{name:string}
}
let foo:info = {name:'张三',age:18
}
// 访问属性:可选链:?.
console.log(foo.friend?.name)
// 属性赋值
// 解决方案一:范围缩小
if(foo.friend){foo.friend.name = '言念'
}
// 解决方案二:非空类型断言(有点危险,只有在确保friend 一定有值时才能使用
foo.friend!.name = '言念'
export{}

字面量类型

type utils = { url: string, method: "post"|"get" }
let request:utils = {url:'xxxx',method:'post'}
request.method as "post"
export {}

类型缩小

//1 typeof
type id = string | number
let foo: id = "123"
if (typeof foo === "string") {console.log(foo.length)
}
// 2 ===/!==
type Direction = "left" | "right" | "top" | "bottom"
function switchDirection(direction: Direction) {if (direction === "left") {console.log("左")} else if (direction === "right") {console.log("右")} else if (direction === "top") {console.log("上")}else if (direction === "bottom") {console.log("下")}
}
// 3 instanceof 传入一个日期,打印日期
function printDate(date: string | Date) {if (date instanceof Date) {console.log(date.getTime())} else {console.log(date)}
}
// 4 in 判断是否有一个属性
interface Iswim {swim: () => void
}
interface Irun {run: () => void
}
function move(animal: Irun | Iswim) {if ("swim" in animal) {animal.swim()} else if ("run" in animal) {animal.run()}
}
const fish: Iswim = {swim: function () { }
}
const dog: Irun = {run: function () { }
}
move(dog)
export { }

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

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

相关文章

Java学习,一文掌握Java之SpringBoot框架学习文集(2)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Docker 安装Mysql

目录 Docker Mysql安装 ✨安装和配置mysql ✨远程连接mysql远程连接 MySQL 是世界上最流行的开源数据库。根据 DB-Engines的调查数据&#xff0c;MySQL 是第二受欢迎的数据库&#xff0c;仅次于 Oracle 数据库。MySQL在过去由于性能高、成本低、可靠性好&#xff0c;已经成…

Redis缓存保卫战:拒绝缓存击穿的进攻【redis问题 三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Redis缓存保卫战&#xff1a;拒绝缓存击穿的进攻 前言缓存击穿的定义和原理为何会发生缓存击穿缓存击穿的危害防范缓存击穿结语: 前言 你是否曾经遇到过系统在高并发情况下出现严重性能问题&#xff…

2023.12.31力扣每日一题——一年中的第几天

2023.12.31 题目来源我的题解方法一 模拟 题目来源 力扣每日一题&#xff1b;题序&#xff1a;1154 我的题解 方法一 模拟 如果月份大于2,&#xff0c;需要判断当年是否是闰年&#xff0c;如果是闰年2月份需要多算一天。 具体计算&#xff1a; 先计算月的贡献&#xff08;注…

微信养号指南:提高账号权重

在如今的社交媒体时代&#xff0c;微信成为了人们生活中必不可少的一部分。它不仅是一个即时通讯工具&#xff0c;更是一个方便快捷的社交平台。然而&#xff0c;要想让自己的微信号保持活跃并吸引更多的关注&#xff0c;需要一些技巧和策略。下面将为大家分享一些微信养号指南…

云卷云舒:基于业务逻辑关联度实现数据预加载

云卷云舒&#xff1a;算力网络云原生&#xff08;下&#xff09;&#xff1a;云数据库发展的新篇章-CSDN博客 一、现有技术的技术方案 在实现一个具有复杂业务逻辑的应用系统时&#xff0c;大多数情况下&#xff0c;编码过程中必定会包含着较多的数据访问方法&#xff08;java…

MES是什么?有了MES还要上ERP或MES吗?

MES是什么 MES是Manufacturing Execution System&#xff08;制造执行系统&#xff09;的简称&#xff0c;是一套面向制造企业车间执行层的生产信息化管理系统&#xff0c;负责承接ERP系统下达的生产计划&#xff0c;与ERP关系密切。MES能通过信息传递&#xff0c;做到生产追溯…

亚马逊、速卖通等跨境平台如何利用自养号测评提升销量

一、自然排名&#xff1a;链接成功的关键 自然排名的重要性不言而喻。一个链接的成功与否&#xff0c;关键在于其自然排名是否能够打上来。无论是搜索流量还是关联流量的自然排名&#xff0c;亦或是BSR排行榜&#xff0c;都应时刻关注这些自然排名的变化。 二、自然排名的位置…

Java使用camerax的例子

在github&#xff0c;自己看吧 https://github.com/7eau/CameraXDemo_Java camerax版本 def camerax_version "1.1.0-beta01" implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:…

Unity 2022 版本 寻路 NavMesh

官方教程地址 https://docs.unity3d.com/Packages/com.unity.ai.navigation1.1/manual/index.html 首先装包 先给地图 和 阻挡 设置为静态 然后给地上行走的地方 添加组件 可以直接bake 然后会显示蓝色的可行走路径 player 添加插件 然后给角色添加脚本 using System.Co…

Keil调试STM32卡死在文件startup_stm32f10x_hd.s的B处

———————Keil调试卡死——————— &#x1f384;问题说明 在移植代码完成后调试时候程序卡死在startup_stm32f10x_hd.s文件的B处 &#x1f384;复现场景 &#x1f384;解决办法 经过查资料&#xff0c;发现是移植的时候&#xff0c;漏掉了终端函数&#xff0c;加上…

MySQL的安装网络配置

目录 一. MySQL5.7的安装 二. MySQL8.0的安装 三. 配置网络访问 思维导图 一. MySQL5.7的安装 1. 解压 2. 将my.ini文件放入到解压文件中 3. 编辑my.ini文件&#xff0c;将路径改为当前路径 4. 进到bin目录下&#xff0c;以管理员身份打开cmd命令窗口 5. 安装MySQL服务 my…

kbdnecat.DLL文件缺失,软件或游戏无法启动运营,快速修复方法

“kbdnecat.DLL文件是什么&#xff1f;为什么一起动游戏或软件&#xff0c;Windows就报错“kbdnecat.DLL文件缺失&#xff0c;软件无法启动””&#xff0c;应该怎么修复呢&#xff1f; 首先&#xff0c;先来了解“kbdnecat.DLL文件”是什么&#xff1f; kbdnecat.DLL是一个动…

LeetCode 45

和跳跃游戏I差不多&#xff5e; class Solution { public:int jump(vector<int>& nums) {const int N1e410;int dp[N]{0};for(int i1;i<nums.size();i){dp[i]0x3f3f3f3f;}//init操作for(int i0;i<nums.size();i){for(int j1;j<nums[i];j){if(ij<nums.siz…

Vue中全局事件总线的配置和原理

实现任意组件之间的通信 任意组件通信的原理&#xff1a; 1、实现任意组件之间的通信,需要一个傀儡。这个傀儡既能被vm访问到,也能被VueComponent访问。 2、VueComponent.prototype.proto Vue.prototype为图上1.0黄色的线路。是Vue让组件实例对象VueComponent可以访问到Vue原…

Invalid options in vue.config.js: “plugins“ is not allowed

项目场景&#xff1a; 安装并配置elementPlus报错。 问题描述 "plugins" is not allowed. plugins不被允许。参考官网修改配置文件vue.config.js。 解决方案&#xff1a; const AutoImport require(unplugin-auto-import/webpack) const Components require(un…

阿里云Alibaba Cloud Linux 3镜像版本清单2024更新

Alibaba Cloud Linux阿里云打造的Linux服务器操作系统发行版&#xff0c;Alibaba Cloud Linux完全兼容完全兼容CentOS/RHEL生态和操作方式&#xff0c;目前已经推出Alibaba Cloud Linux 3&#xff0c;阿里云百科aliyunbaike.com分享Alibaba Cloud Linux 3版本特性说明&#xff…

即时通讯技术文集(第30期):IM开发综合技术合集(Part3) [共16篇]

为了更好地分类阅读 52im.net 总计1000多篇精编文章&#xff0c;我将在每周三推送新的一期技术文集&#xff0c;本次是第30 期。 ​[- 1 -] 全面掌握移动端主流图片格式的特点、性能、调优等 [链接] http://www.52im.net/thread-1802-1-1.html [摘要] 本文我们一起全面分析学…

HCIA-Datacom题库(自己整理分类的)——其他网络协议【完】

&#xff08;一&#xff09;单选 下列属于链路状态协议的是? Direct static FTP OSPF 解析&#xff1a; FTP&#xff1a;文件传输协议 OSPF&#xff1a;链路状态路由协议 如下图所示的网络主机A通过Telnet登录到路由器A然后在远程的界面通过FTP获取路由器的配置文件&…

学习调整echarts中toolbox位置toolBox工具栏属性

学习调整echarts中toolbox位置toolBox工具栏属性 toolbox工具栏属性介绍示例代码代码参数说明 toolbox工具栏属性介绍 参考网址&#xff1a;https://echarts.apache.org/zh/option.html#tooltip 属性类型说明toolbox.showbooleanboolean 默认值为true&#xff0c;是否显示工具…