位置: IT常识 - 正文

【进阶】TS 中的 类型断言 和 泛型(ts入门教程)

编辑:rootadmin
【进阶】TS 中的 类型断言 和 泛型 类型断言

推荐整理分享【进阶】TS 中的 类型断言 和 泛型(ts入门教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:ts中的keyof,ts中的enum,ts入门教程,ts中的?,ts中的keyof,ts技术,ts中的?,ts中的typeof,内容如对您有帮助,希望把文章链接给更多的朋友!

作用 : 手动指定值的具体类型 ( 缩写值的范围 )

应用场景 1

获取 DOM 元素的时候指定具体元素

示例 :

const box = document.getElementById('img')console.log(box.src) // ts报错

错误内容 :

解析 : 上述语法在 js 中可以直接使用, 但是 TS 中就不行啦, 由于类型不明确会报错

返回值的类型是 HTMLElement,只有标签公共的属性,不包含 img 的 src 属性

解决方法 : 使用类型断言明确具体类型

语法 : let 变量 = 值 as 类型

as 关键字实现类型断言关键字 as 后面的类型是一个具体的类型

实例 :

const box = document.getElementById('img') as HTMLImageElement指定了具体类型后 , 就可以使用 box.src 了

技巧: 获取 DOM 元素类型的方法

在浏览器控制台,通过 __proto__ 获取 DOM 元素的类型;document.createElement('a'),然后看代码提示、

应用场景 2

知道获取数据的类型, 但是不知道具体的数据时 , 使用类型断言后就会有提示

type User = { name: string, age: number}const u1 = {} as Userconsole.log(u1.name) // 这里就会有提示非空断言

作用 : 明确地知道对象的属性一定不会为空,可以使用非空断言 !

应用场景 : TS 中 使用 useRef()

JS 中的语法直接使用会报错

错误解析 :

useRef 类型说明 : useRef的泛型参数用于指定current属性的值的类型

传入参数 null 时 , current属性的值类型也被指定为 null

解决方法 :

指定 useRef的泛型参数类型为 HTMLInputElement (已知类型)使用非空断言! 指定current属性的值不为空function App() { const inputRef = useRef<HTMLInputElement>(null) return ( <div className="App"> <input type="text" ref={inputRef} /> <button onClick={() => { console.log(inputRef.current!.value) }}>点击</button> </div>)}typeof

TS 中的 typeof 操作符 和 js 中的一样都是用来获取变量或属性类型

使用方法 :

获取类型 : type 变量 = typeof 常量

使用 : function(参数:变量){参数.常量的方法}

应用场景

获取到一个复杂的对象,我们把它当做实参传给一个函数fn,但是没有办法在使用形参时获取提示信息

typeof 解决

const res = { name: '小花', city: '武汉', skills: ['js', 'css'] }type Stu = typeof resfunction fn(obj:Stu) { // 这里写 obj. 就会有提示 obj.skills}fn(res)

注意 : typeof 只能用来查询变量或属性的类型,无法查询其他形式的类型(比如,函数调用的类型)

keyof

获取对象类型的属性名 , 得到新的类型

type 类型 = keyof 类型

实例type Point = { x: number; y: number }type P = keyof Pointtype 类型 = keyof 对象常量

type T = keyof {a:1,b:2}

使用方法

获取类型的属性名 :

type T = keyof {a:1,b:2}== type T = 'a'|'b'

使用 : let 变量:T = 'a'

变量的取值只能是 ‘a’或者’b’ 泛型

什么是泛型

顾名思义就是多个类型 , TS 中指使用变量保存要使用的类型

【进阶】TS 中的 类型断言 和 泛型(ts入门教程)

泛型本质

泛型本质是参数化类型 , 就是所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和函数的创建中,分别成为泛型类,泛型接口、泛型函数

泛型函数

什么是泛型函数 :

这个函数的参数类型或者返回值的类型是可变的

定义泛型函数 :

function 函数名<类型参数> (形参:类型参数):类型参数{}

在函数名称的后面写 <>(尖括号),尖括号中添加类型变量类型变量相当于一个类型容器,能够捕获用户提供的类型(具体是什么类型由用户调用该函数时指定)

使用泛型函数

方法1: const 返回值 = 函数名(实参) 类型推论实参的类型,传递给类型参数方法2 : const 返回值= 函数名<类型实参>(实参) 上述的非空断言就使用了此种方法此时的 <> 中的就是具体的类型

示例

// 泛型函数 function useState<T>(val: T | (() => T)): [T | (() => T), (newvalue: T) => void]{ return [val,(newvalue)=>{val=newvalue}] } const [str,setStr] = useState('1') const [num,setNum] = useState<number>(1) const [fn, setFn] = useState<number>(() => 1)泛型推论

泛型推论就是, 利用类型推论简化函数调用

在调用泛型函数时,可以省略 <类型> 来简化泛型函数的调用此时,TS 内部采用一种类型参数推断的机制,来根据传入的实参自动推断出类型变量 Type 泛型对象

应用场景 :

函数中传入对象和该对象的属性,要求得到给对象的值

// 泛型对象 function getProp<T, K extends keyof T>(arr: T, key: K) { return arr[key] } let obj ={name:'ikun',age:18,hobby:'学习'} getProp(obj,'hobby')

解析 :

上述约定后, 后续调用时会有提示

泛型的问题

太灵活了

默认情况下,泛型函数的类型变量 可以代表多个类型,这导致在泛型函数内部无法访问任何属性function fn<T>(value: T): T { // 这里value. 不会有提示 console.log(value.length)// 这里会报错 return value}fn('a')

解决泛型太灵活的方法

为泛型添加约束来收缩类型(缩窄类型取值范围)

泛型约束

泛型约束主要有以下两种方式:

指定更加具体的类型添加约束

指定更加具体的类型

指定更具体的类型缩小范围

function fn<T>(value: T[]): T[] { console.log(value.length) // 这里就可以获得提示 return value}

T[] 数组一定会有length属性

添加约束(推荐使用)

对已有类型做继承,已有类型中指定了 length属性

interface ILength { length: number } function fn1<T extends ILength>(value: T): T { // 这里value. 不会有提示 console.log(value.length) return value }泛型接口

在接口中使用泛型来使用,以增加其灵活性,增强其复用性

语法 :

interface 接口名<类型变量1,类型变量2...> { 属性名1:类型1, 属性名2:类型2, 属性名3:类型3}

注意 :

在接口名称的后面添加 <类型变量>,那么,这个接口就变成了泛型接口。接口的类型变量,对接口中所有其他成员可见,也就是接口中所有成员都可以使用类型变量。使用泛型接口时,需要显式指定具体的类型

实例:

interface MyArray { length: number, push(n: number):void, pop():number, reverse():number[]}let obj: MyArray = { id(value) { return value }, ids() { return [1, 3, 5] }}

数组在ts中就是一个泛型接口

泛型工具类型Partial

把已有的类型属性,变成一个新类型的可选属性

语法 : type 新类型 = partial<老类型>

Readonly

把已有类型全部转换为只读类型

语法和上述一直

定义对象使其内在属性不能修改

Pick

从已有类型中选一些属性来构造新的类型

语法 : type 新类型 = partial<老类型,属性|属性2>

详见代码

代码地址: github.com/jiang-zi/TS…

本文链接地址:https://www.jiuchutong.com/zhishi/299164.html 转载请保留说明!

上一篇:户外电源强制国标发布或加速行业洗牌 未来产品将往大容量及轻量化发展(户外电源需要要充电吗)

下一篇:2023前端面试题第二弹(真实,一般人我还不给看)(2023前端面试题目)

  • 手机密码忘了怎么办(手机密码忘了怎么解锁?华为)

    手机密码忘了怎么办(手机密码忘了怎么解锁?华为)

  • 美图秀秀拼图视频没有声音(美图秀秀拼图视频怎么没有原声音)

    美图秀秀拼图视频没有声音(美图秀秀拼图视频怎么没有原声音)

  • 为什么抖音粉丝增加不显示(为什么抖音粉丝每天都在掉)

    为什么抖音粉丝增加不显示(为什么抖音粉丝每天都在掉)

  • ppt占位符怎么删除(ppt占位符删除)

    ppt占位符怎么删除(ppt占位符删除)

  • 淘宝买的素材能商用吗(淘宝买的素材能做书本内容吗)

    淘宝买的素材能商用吗(淘宝买的素材能做书本内容吗)

  • 极速退款有次数限制吗(极速退款次数多了有影响吗)

    极速退款有次数限制吗(极速退款次数多了有影响吗)

  • 手机网卡是不是很耗电(手机网卡是不是中毒了)

    手机网卡是不是很耗电(手机网卡是不是中毒了)

  • 电脑温度80度正常吗(电脑温度82度正常吗)

    电脑温度80度正常吗(电脑温度82度正常吗)

  • 笔记本激活后不支持退货是什么意思(笔记本激活后不能退怎么办)

    笔记本激活后不支持退货是什么意思(笔记本激活后不能退怎么办)

  • 抖音能查到电话号码吗(抖音能查到电话实名信息吗)

    抖音能查到电话号码吗(抖音能查到电话实名信息吗)

  • 手机怎么弄电子身份证(手机怎么弄电子版证件照)

    手机怎么弄电子身份证(手机怎么弄电子版证件照)

  • 抖音内测版本有啥用(抖音内测版本有啥用,抖音内测版有什么区别)

    抖音内测版本有啥用(抖音内测版本有啥用,抖音内测版有什么区别)

  • qq共享位置怎么改变自己的位置(qq共享位置怎么改定位)

    qq共享位置怎么改变自己的位置(qq共享位置怎么改定位)

  • 淘宝什么情况下不能代付(淘宝什么情况下可以拉黑买家)

    淘宝什么情况下不能代付(淘宝什么情况下可以拉黑买家)

  • 微信零钱通怎么隐藏金额(微信零钱通怎么设置密码锁不让别人看)

    微信零钱通怎么隐藏金额(微信零钱通怎么设置密码锁不让别人看)

  • 文档怎么竖排(文档怎么竖排打字)

    文档怎么竖排(文档怎么竖排打字)

  • 手机上可以交电费吗(手机上可以交电视费吗)

    手机上可以交电费吗(手机上可以交电视费吗)

  • 微信加人验证语怎么改(微信加人验证语固定怎改掉)

    微信加人验证语怎么改(微信加人验证语固定怎改掉)

  • opopa3耳机在哪设置(oppoa3手机耳机模式怎么调回来)

    opopa3耳机在哪设置(oppoa3手机耳机模式怎么调回来)

  • 电池医生怎么检查电池(电池医生的电池健康度准吗)

    电池医生怎么检查电池(电池医生的电池健康度准吗)

  • 小米ai音箱如何控制小米电视(小米ai音箱如何蓝牙配对)

    小米ai音箱如何控制小米电视(小米ai音箱如何蓝牙配对)

  • 手机怎么重设路由器密码(手机怎么重设路由器设置)

    手机怎么重设路由器密码(手机怎么重设路由器设置)

  • erp系统有几种(erp系统分为)

    erp系统有几种(erp系统分为)

  • 新买的苹果电脑如何复制粘贴、复制粘贴键是什么(新买的苹果电脑需要注意什么)

    新买的苹果电脑如何复制粘贴、复制粘贴键是什么(新买的苹果电脑需要注意什么)

  • java中PrintStream创建对象(java printing)

    java中PrintStream创建对象(java printing)

  • 政府征用土地补偿标准2021年
  • 企业所得税上个月没有计提本月怎么计提
  • 发票第一联需要保存多久
  • 坏账准备应计入
  • 月利润报表怎么制作
  • 去年开的专票今年可以作废吗
  • 税务局代开发需要盖章吗
  • 畜牧生物工程有限公司
  • 销售使用过的固定资产3%减按2%
  • 销售产品货款存入银行是什么凭证
  • 预告登记与备案的区别
  • 广告公司好进吗
  • 车间领用周转材料会计分录怎么写
  • 服务行业营业成本包括财务费用和管理费用吗
  • 财务报表与汇算报表区别
  • 工会劳动保护费不能列支劳保用品
  • 一般纳税人注销库存需要补交税吗
  • 小规模纳税人的好处
  • 销售废旧物资账务处理
  • 个人取得的拍卖资格
  • 期间费用燃油费计入哪个项目?
  • 小规模建筑工程
  • 社保缴费申报表文件
  • 生产设备投资入股增值税
  • iphone7如何设置输入法
  • rundll.exe是什么程序
  • 公司向私人借款利息可以入账吗
  • php字符串定义
  • 期间费用包含哪些
  • 业务招待费有
  • pc端微信扫码支付
  • 如何取消库存商品订单
  • 烟花绽放的除夕夜题目
  • thinkphp框架入门
  • 应收账款应付账款属于什么科目
  • html怎么设置隐藏元素
  • 残疾人保证金优惠减免怎么申请退税
  • 深究Python中的asyncio库-线程池
  • 研发支出的相关理论基础有哪些
  • vue组件怎么使用
  • 旅行社专票开票内容的规定
  • 持有投资期间,被投资单位编制合并报表
  • 印花税没交会怎么样
  • 以下哪些企业需要填报
  • 利润表的格式分为哪几种
  • 弃置费用预计负债的摊余成本
  • 销售货物免税
  • 没授权的帝国cms作为商用行吗
  • mongodb与mysql相比的优缺点
  • 终止合约取得的合约
  • 长期待摊费用账务处理包括哪两部分
  • sql2005怎么执行语句
  • sql按照日期范围查询
  • 增值税期末留抵退税原因采集确认单
  • 年度亏损计提所得税吗
  • 应收票据周转率公式
  • 银行退回转账
  • 工程结算审核资料清单
  • 进项发票认证多了留抵多久
  • 用于研发购买的云服务器应计入研发费用直接投入里吗
  • 其它流动资产为负数原因
  • 往来会计岗位职责怎么写
  • mysql登陆error2002
  • mysql exists与not exists实例详解
  • 强化廉洁意识 筑牢思想防线
  • hppusg.exe
  • 进程lsass.exe
  • mac itunes在哪儿
  • win10预览版怎么升级到正式版
  • win8电脑设置打不开怎么办
  • win10专业版怎么改用户名
  • 平板电脑安装的是什么格式的软件
  • win7电脑出现广告弹窗怎么办
  • javascript cookies
  • shell脚本sudo免输密码
  • jquery的用法
  • android退出功能
  • python3获取本机ip
  • 税务稽查局稽查财务不在场怎么办
  • 云南省国家税务总局处长名单
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设