TypeScript_泛型
typescript 中很多地方都和 java 和 C# 相似,如果 有 java 和 C# 的同学入手typeScript 会简单很多,
下面这里使用代码来表示和展现泛型的定义和使用
//泛型:在类、接口、函数中对不确定(未知)的数据类型的支持,提高 类、接口、函数代码的复用性,减少冗余
//开发人员可以根据不同的数据类型使用同一个接口、函数或者类 /**
* 以下例子
* 定一个获取最小值的函数,当获对应的集合为 数字 时,需编写一个 针对数字集合 获取最小值的函数,
* 当集合为 字符串 时,则需另外定义一个针对字符串集合获取最小值得函数,
* 这时就会会造成代码的冗余,代码复用性低
* 如下:
*/
function min1(list:number[]):number{
let minRes:number = list[0];
list.forEach((item, index)=>{
if(item < minRes){
minRes = item;
}
});
return minRes;
} function min2(list:string[]):string{
let minRes:string = list[0];
list.forEach((item, index)=>{
if(item < minRes){
minRes = item;
}
});
return minRes;
} console.log(min1([9,3,4,2,5])); // 输出 2
console.log(min2(['r','a','c','b','h','f'])); // 输出 a /**
* 使用泛型则可以解决以上问题
* 传入和返回的数据类型由函数调用者自己来决定, 无需多写冗余的代码
* T 代表未知类型, 也可用用其他自定义单词或者字母表示
*/
function min<T>(list:T[]):T {
let minRes:T = list[0];
list.forEach((item, index)=>{
if(item < minRes){
minRes = item;
}
});
return minRes;
} console.log(min1([9,3,4,2,5])); // 输出 2
console.log(min2(['r','a','c','b','h','f'])); // 输出 a /**
* 泛型类
*/
class Operation<T>{
list:T[] = [];
constructor(){} add(v:T):void{
this.list.push(v);
} getList():T[]{
return this.list;
} min():T{
let minRes:T = this.list[0];
this.list.forEach((item, index)=>{
if(item < minRes){
minRes = item;
}
});
return minRes;
}
} //指定类型为number类型
let o = new Operation<number>(); //实例化类,并指定了类中 T 代表的是 number类型
//o.add('e'); //报错,必须为number类型
o.add(6);
o.add(4);
o.add(8);
o.add(7);
console.log(o.getList()); // 输出: [6, 4, 8, 7]
console.log(o.min()); //输出: 4 let o1 = new Operation<string>(); //实例化类,并指定了类中 T 代表的是 string类型
// o1.add(6); //报错,必须为字符串类型
o1.add('e');
o1.add('n');
o1.add('b');
o1.add('l');
console.log(o1.getList()); // 输出: ["e", "n", "b", "l"]
console.log(o1.min()); //输出: b /**
* 泛型接口
*/
interface Z<T> {
value:T;
getValue():T;
} //第一种: 直接在类中定义指定类型
class A implements Z<string> {
value:string;
constructor(name:string){
this.value = name;
}
getValue(): string {
return this.value;
}
} //实例化类时,传入指定类型
let a = new A('aaa');
alert(a.getValue()) //第二种:在类中指定任意类型
class B<Q> implements Z<Q> {
value :Q;
constructor(name:Q){
this.value = name;
}
getValue(): Q {
return this.value;
}
} //实例化类时,可指定任意的类型
let b = new B<number>(1111);
alert(b.getValue()); let b1 = new B<string>('b1b1b1');
alert(b1.getValue())
TypeScript_泛型的更多相关文章
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- .NET面试题系列[8] - 泛型
“可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用.“ - Jon Skeet .NET面试题系列目录 .NET面试题系列[1] - .NET框架基础知识(1) .NET面试题系列[2] ...
- C#4.0泛型的协变,逆变深入剖析
C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)
建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- C#泛型详解(转)
初步理解泛型: http://www.cnblogs.com/wilber2013/p/4291435.html 泛型中的类型约束和类型推断 http://www.cnblogs.com/wilber ...
- C# 泛型
C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...
- java8中lambda表达式的应用,以及一些泛型相关
语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...
- java 泛型
1.Student stu =tool.getObj();右边得到的是Object类型,需要向下转型,强转换. 2. 3. 4.泛型方法不能被静态修饰这样写 5.如果想定义定义静态泛型方法,只能这样写 ...
随机推荐
- mongo 笔记
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options ...
- k8s记录-ubuntu安装docker
sudo apt-get purge docker-ce sudo rm -rf /var/lib/dockerdocker-ce:https://download.docker.com/linux/ ...
- [LeetCode] 136. Single Number 单独数
Given a non-empty array of integers, every element appears twice except for one. Find that single on ...
- Jenkins - 安装并启动Jenkins
1 - 关于Jenkins 构建流水线(build pipeline)工具Jenkins可以轻松地定义和管理各种各样的操作(构建.测试等),并将这些操作像管道pipe一样自由地进行组合,从而自动.流畅 ...
- Rufus软件
Rufus软件(https://rufus.akeo.ie/)——制作启动盘必备,简易且开源.
- 【视频开发】 十全大补:CxImage图像处理类库
十全大补:CxImage图像处理类库 转载IT168 CxImage是一个可以用于MFC 的C++图像处理类库类,它可以打开,保存,显示,转换各种常见格式的图像文件,比如BMP, JP ...
- c++中的不是数的数nan
matlab中经常碰到nan,inf等特殊“数”,而在C++中也有相应的表示:例如std::numeric_limits <float>::quiet_NaN ();可以得到浮点型的nan ...
- 阿里的Netty知识点你又了解多少
前言 Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程.Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问 ...
- ScheduledExecutorService调度线程池运行几次后停止某一个线程
开发中偶尔会碰到一些轮询需求,比如我碰到的和银行对接,在做完某一个业务后银行没有同步给到结果,这时候就需要查询返回结果,我们的需求是5分钟一次,查询3次,3次过后如果没有结果则T+1等银行的文件,对于 ...
- Python之序列化概念
我们把对象(变量)从内存中变成可存储或运输的过程称之为序列化,在 Python 中叫 pickling ,在其他的语言中也被称之为 serialization,marshalling,flatteni ...