位置: 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前端面试题目)

  • objectmapper.readvalue方法(objectmapper.readvalue方法不安全)

    objectmapper.readvalue方法(objectmapper.readvalue方法不安全)

  • 微信登录操作频繁(微信登录操作频繁怎么办)

    微信登录操作频繁(微信登录操作频繁怎么办)

  • 苹果官网为什么发货这么慢(苹果官网为什么比京东贵那么多)

    苹果官网为什么发货这么慢(苹果官网为什么比京东贵那么多)

  • 华为如何下载腾讯视频(华为如何下载腾讯软件)

    华为如何下载腾讯视频(华为如何下载腾讯软件)

  • 小米手表苹果手机能用吗(小米手表苹果手机来电不显示)

    小米手表苹果手机能用吗(小米手表苹果手机来电不显示)

  • 华为有没有上市(华为有没有上市?)

    华为有没有上市(华为有没有上市?)

  • 苹果原装耳机音质什么水平(苹果原装耳机音质好还是airpods音质好)

    苹果原装耳机音质什么水平(苹果原装耳机音质好还是airpods音质好)

  • 抖音公众号为什么充值不了(抖音发公众号会封吗)

    抖音公众号为什么充值不了(抖音发公众号会封吗)

  • 中国移动无服务怎么恢复(中国移动无服务怎么联系客服)

    中国移动无服务怎么恢复(中国移动无服务怎么联系客服)

  • 手机突然不能开热点(手机突然不能开视频了是怎么回事?)

    手机突然不能开热点(手机突然不能开视频了是怎么回事?)

  • 脚注和参考文献需要一致吗(脚注和参考文献可以在一篇论文里吗)

    脚注和参考文献需要一致吗(脚注和参考文献可以在一篇论文里吗)

  • ppt2010版本中有几种视图(PPT2010版本中有几种视图)

    ppt2010版本中有几种视图(PPT2010版本中有几种视图)

  • 电脑背景变成黑色的了是为什么(电脑背景变成黑色了如何调回正常)

    电脑背景变成黑色的了是为什么(电脑背景变成黑色了如何调回正常)

  • 苹果xr怎么开闪光灯(苹果xr怎么开闪光)

    苹果xr怎么开闪光灯(苹果xr怎么开闪光)

  • 手机ke是什么(手机壳是什么垃圾分类)

    手机ke是什么(手机壳是什么垃圾分类)

  • icloud储存空间升级没反应(icloud储存空间升级不了)

    icloud储存空间升级没反应(icloud储存空间升级不了)

  • ipadmini2支持ios13系统吗(iPadmini2支持OTG吗)

    ipadmini2支持ios13系统吗(iPadmini2支持OTG吗)

  • 电脑带不动游戏是什么原因(电脑带不动游戏会出现什么情况)

    电脑带不动游戏是什么原因(电脑带不动游戏会出现什么情况)

  • 微信给对方转账后删除好友对方还能收到吗(微信给对方转账不显示名字是被删了吗?)

    微信给对方转账后删除好友对方还能收到吗(微信给对方转账不显示名字是被删了吗?)

  • 因特网属于一种什么网(因特网属于一种局域网)

    因特网属于一种什么网(因特网属于一种局域网)

  • 手机5.5寸有多大(5.5寸的手机长度是多少)

    手机5.5寸有多大(5.5寸的手机长度是多少)

  • airpods支持iphone几(airpods支持快充吗)

    airpods支持iphone几(airpods支持快充吗)

  • 如何不退群而拒收群消息(不退群怎么能屏蔽群消息)

    如何不退群而拒收群消息(不退群怎么能屏蔽群消息)

  • 苹果系统更新后查找朋友还能用吗(苹果系统更新后怎么还原到原来的系统版本)

    苹果系统更新后查找朋友还能用吗(苹果系统更新后怎么还原到原来的系统版本)

  • 高德地图如何显示速度(高德地图如何显示海拔)

    高德地图如何显示速度(高德地图如何显示海拔)

  • 怎么搜微博用户(怎么搜索到微博用户)

    怎么搜微博用户(怎么搜索到微博用户)

  • 抖音怎么保存静态壁纸(抖音怎么保存静态视频)

    抖音怎么保存静态壁纸(抖音怎么保存静态视频)

  • Windows 11目前缺失或即将消失的功能(windows缺失)

    Windows 11目前缺失或即将消失的功能(windows缺失)

  • 大雾山国家公园,田纳西州 (© Tony Barber/Getty Images)(大雾山国家公园在哪里)

    大雾山国家公园,田纳西州 (© Tony Barber/Getty Images)(大雾山国家公园在哪里)

  • 合同中增值税税率怎么描述
  • 长期待摊费用摊销年限规定
  • 天然气入户安装需要什么资质
  • 固定资产一次性折旧的账务处理和税务处理
  • 贷款逾期的本金怎么计算
  • 车辆的鉴定评估方法
  • 汽修店的服务项目有哪些
  • 押金满一年才能退
  • 住宿发票的税率0
  • 合伙企业出资额不计入实收资本和资本公积 那放哪
  • 财务负责人和办税人员哪个责任大
  • 扣收手续费
  • 全国失信人员信息
  • 季度弥补以前年度亏损报表怎么填
  • 公允价值变动增加在借方还是贷方
  • 固定资产被政府查封
  • 出售设备折旧
  • 有质量问题的产品案例
  • 财务报表包括哪三大报表?(多选)
  • 员工报销可以从一般账户转出吗
  • 主营业务收入发票
  • 公司开承兑出去 利息怎么算
  • 如何设置谷歌浏览器语言为中文
  • win10怎么设置硬盘为第一启动项
  • PHP:oci_cancel()的用法_Oracle函数
  • 蔚蓝的海怎么样
  • 拉马克是哪国人
  • avoid什么用法
  • php怎么访问本地的网页
  • 销售金额环比
  • 图像修复技术
  • 万科金域华府二手房房源
  • 帝国cms栏目可以看吗
  • 高新技术企业福利费扣除比例
  • 预付账款后收到货物会计分录
  • mongodb快速入门
  • 纳税信用等级区别在哪
  • 实发工资属于什么科目
  • 出售固定资产的损失计入什么科目
  • 股份支付属于应付职工薪酬吗?
  • 快速实现愿望超灵的方法
  • 计提制造费用
  • 资本公积可以转增资本因此称之为准资本
  • 允许加计扣除的新技术研究开发费用是
  • macos添加用户
  • 烟丝缴纳消费税计算
  • 短期偿债能力是企业的任何利益关系人都
  • 增值税发票的抵扣期限
  • 纳税人防伪税控设备未抄报怎么办
  • 行程单入账多久钱能到账
  • 税费改革的思路
  • 发票金额大于实际报销怎么做账
  • 清理固定资产的税费
  • 公司章程进行变更的条件
  • 仓库做账应该注意些哪些事项
  • 给别人的借款怎么记账
  • 公司法人可以变更给老人吗
  • 最新mysql数据库安装步骤
  • linux安装linux
  • mac怎么多开
  • linux如何拨号
  • win1020h2正式版
  • linux查看sh
  • win7系统360浏览器自动打开怎么关闭
  • win7怎么样激活
  • unity3d documentation
  • nodejs bff
  • python有没有翻译库
  • 教你一行代码
  • js 异步队列
  • scrollcontroller
  • bat批处理文件的语句
  • node写自动化脚本
  • jquery根据value获取元素
  • 权限android.permission.write
  • 基于JAVASCRIPT实现的可视化工具是
  • 国家税务局涉税信息公开
  • 税收征收管理与实践
  • 购车发票购置税是否包含在内
  • 个税申报所属期和所得期
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设