当前位置: 首页 > news >正文

六、typescript泛型使用

1.identity函数,这个函数会返回任何传入它的值,可以看作是echo命令

function identity(arg:number):number
{return arg
}


使用any类型会导致这个函数可以接收任何类型的参数,这样会丢失一些信息,传入与返回类型应该是相同的 有特殊变量表示 类型变量:T

function  indentity(arg:any):any{
return arg
}function identity<T>(arg:T):T{return arg}

2.定义泛型函数,两种使用方法

  1. 使用 <>
let output = identity<string>('mystring'')
明确了T类型是string

2.类型推论–即编辑器会根据传入的参数自动确定T的类型

let output = identity('mystring')

3.使用泛型变量:

function indentity<T>(arg:T):T{console.log(arg.length) //error 有可能传入的是number没有length
}

4.可创建数组

function indentity<T>(arg:T[]):T[]{console.log(arg.length)
}
//或者
function indentity<T>(arg:Array<T>):Array<T>{}

5.泛型类型:
泛型函数的类型与非泛型函数的类型没有什么不同,只是一个类型参数在最前面

function indentity<T>(arg:T):T{return arg
}
let myIndent:<T>(arg:T)=>T=indetitylet myindent:<U>(arg:U)=>U=indentity  //不同的泛型参数名

6.泛型接口:

interface Fn{<T>(arg:T):T
}
function indent<T>(arg:T):T{return arg
}let myindent:Fn=indent

7.还可创建泛型类,注:无法创建泛型枚举和泛型命名空间
泛型类:指的是类的实例部分,所有类的静态属性不能使用这个泛型类

class Fn<T>{zeroValue:T;add:(s:T,y:T)=>T
}let fn1 = new Fn<number>()
fn1.zeroValue=0
fn1.add=function(x,y){return x+y}

8.泛型约束:

interface Length{length:number
}function indentity<T extends Length>(arg:T):T{console.log(arg.length)  //error//这个泛型函数已经被定义了约束,不宰适用于任意类型
}
//需要传入符合约束类型值,必须包括必须的属性
indentity({length:10,value:3})

9.在泛型约束中使用类型参数:

function obj(obj:T,key:K){return obj[key]
}let x = ['a','b','c']obj(x,'a')  //ok
obj(x,'aa')  //error a b c

10.在泛型里使用类类型:

function create<T>(c:{new() :T}):T{return new c()
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Django 后台与便签
  • 苹果电脑Dock栏优化软件 mac功能亮点
  • 基于MATLAB编程的BP神经网络土地分类,bp神经网络详细原理
  • 2023年十篇具有影响力的人工智能研究论文
  • HarmonyOS4.0系统性深入开发07创建一个ArkTS卡片
  • SQL常见面试题
  • C++:继承(这一篇就够了)
  • css视觉格式化模型
  • JavaScript 中常用事件
  • shell打印粉色小心心、颜文字心心
  • 高效文件管理:利用文件名关键字进行归类,批量移动文件
  • Cypress安装与使用教程(3)—— 软测大玩家
  • 应用在网络摄像机领域中的国产音频ADC芯片
  • 二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)
  • 漏洞复现-海康威视网络对讲广播系统远程命令执行漏洞(附漏洞检测脚本)
  • JS 中的深拷贝与浅拷贝
  • bearychat的java client
  • Intervention/image 图片处理扩展包的安装和使用
  • Invalidate和postInvalidate的区别
  • JavaScript新鲜事·第5期
  • Laravel 菜鸟晋级之路
  • mongodb--安装和初步使用教程
  • React-Native - 收藏集 - 掘金
  • SpringCloud集成分布式事务LCN (一)
  • 从零开始学习部署
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 深入 Nginx 之配置篇
  • 微信支付JSAPI,实测!终极方案
  • 用Canvas画一棵二叉树
  • PostgreSQL之连接数修改
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • # 安徽锐锋科技IDMS系统简介
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #NOIP 2014#Day.2 T3 解方程
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • $GOPATH/go.mod exists but should not goland
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (三)SvelteKit教程:layout 文件
  • (十八)SpringBoot之发送QQ邮件
  • (四)鸿鹄云架构一服务注册中心
  • (一)Neo4j下载安装以及初次使用
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • ***测试-HTTP方法
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .net下的富文本编辑器FCKeditor的配置方法
  • .net专家(张羿专栏)
  • 。。。。。
  • ?.的用法
  • [ IO.File ] FileSystemWatcher
  • [20180129]bash显示path环境变量.txt