泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。

在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。

通俗理解:泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持(类型校验)

先看看下面的例子:

  1. //只能返回string类型的数据
  2.  
  3. function getData(value:string):string{
  4. return value;
  5. }
  6.  
  7. //同时返回 string类型 和number类型 (代码冗余)
  8.  
  9. function getData1(value:string):string{
  10. return value;
  11. }
  12.  
  13. function getData2(value:number):number{
  14. return value;
  15. }

使用泛型后就可以解决这个问题

  1. // T表示泛型,具体什么类型是调用这个方法的时候决定的
  2.  
  3. function getData<T>(value:T):T{
  4. return value;
  5. }
  6. getData<number>(123);
  7.  
  8. getData<string>('1214231');

泛型类

  1. //普通的类
    class MinClass{
  2. public arr:number[]=[];
  3. add(value:number){
  4. this.arr.push(value);
  5. }
  6. min():number{
  7. var minNumber=this.arr[0];
  8. for(let i=0;i<this.arr.length;i++){
  9. if(minNumber>this.arr[i]){
  10. minNumber=this.arr[i]
  11. }
  12. }
  13. return minNumber;
  14. }
  15.  
  16. }
  17. var m=new MinClass();
  18. m.add(12);
  19. m.add(23);
  20. m.add(5);
  21. alert(m.min());//显示5
  22. //上面的有个问题就是你传入的值只能是number类型,返回的也是number,如果传入字符创就会报错,解决办法:泛型类
  23. //定义泛型类
  24. class MinClassT<T>{
  25. public arr:T[]=[];
  26. add(value:T){
  27. this.arr.push(value);
  28. }
  29. min():T{
  30. var minNumber=this.arr[0];
  31. for(let i=0;i<this.arr.length;i++){
  32. if(minNumber>this.arr[i]){
  33. minNumber=this.arr[i]
  34. }
  35. }
  36. return minNumber;
  37. }
  38. }
  39. var m1=new MinClassT<number>();
  40. m1.add(15);
  41. m1.add(16);
  42. m1.add(7);
  43. alert(m1.min());
  44.  
  45. var m2=new MinClassT<string>();
  46. m2.add('a');
  47. m2.add('b');
  48. m2.add('c');
  49. alert(m2.min());

泛型接口:

  1. interface ConfigFn{
  2.  
  3. <T>(value:T):T;
  4. }
  5.  
  6. var getData:ConfigFn=function<T>(value:T):T{
  7.  
  8. return value;
  9. }
  10.  
  11. getData<string>('张三');
  12.  
  13. getData<string>(1243); //错误

还有一种写法:

  1. interface ConfigFn<T>{
  2. (value:T):T;
  3. }
  4.  
  5. function getData<T>(value:T):T{
  6.  
  7. return value;
  8. }
  9.  
  10. var myGetData:ConfigFn<string>=getData;
  11.  
  12. myGetData('20'); /*正确*/
  13.  
  14. // myGetData(20) //错误

typescript中的泛型的更多相关文章

  1. 十分钟教你理解TypeScript中的泛型

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://blog.bitsrc.io/understanding-generics-in-t ...

  2. TypeScript笔记[5]泛型+Dictionary 转

    TypeScript笔记[5]泛型   在C++.C#.Java等主流编程语言中,一般对泛型编程提供了支持.合理利用泛型,可以提高开发效率.提升代码质量. 例如在C++编程语言中,常常利用下面的结构表 ...

  3. TypeScript完全解读(26课时)_6.TypeScript完全解读-泛型

    6.TypeScript完全解读-泛型 创建实例ts文件generics.ts 在index.ts内引入 fill是填充数组,创建的数组的元素数是times,填充的值就是接收的value的值 这里传入 ...

  4. 聊聊 TypeScript 中的类型保护

    聊聊 TypeScript 中的类型保护 在 TypeScript 中使用联合类型时,往往会碰到这种尴尬的情况: interface Bird { // 独有方法 fly(); // 共有方法 lay ...

  5. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  6. Java中的泛型 (上) - 基本概念和原理

    本节我们主要来介绍泛型的基本概念和原理 后续章节我们会介绍各种容器类,容器类可以说是日常程序开发中天天用到的,没有容器类,难以想象能开发什么真正有用的程序.而容器类是基于泛型的,不理解泛型,我们就难以 ...

  7. 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  8. asp.net三层架构 及其中使用泛型获取实体数据介绍

    asp.net中使用泛型获取实体数据可以发挥更高的效率,代码简洁方便,本例采用三层架构.首先在model层中定义StuInfo实体,然后在 DAL层的SQLHelper数据操作类中定义list< ...

  9. 窥探Swift之使用Web浏览器编译Swift代码以及Swift中的泛型

    有的小伙伴会问:博主,没有Mac怎么学Swift语言呢,我想学Swift,但前提得买个Mac.非也,非也.如果你想了解或者初步学习Swift语言的话,你可以登录这个网站:http://swiftstu ...

随机推荐

  1. Python调用ansible API系列(五)综合使用

    如何把动态生成资产信息.执行playbook以及自定义结果结合起来用呢? #!/usr/bin/env python # -*- coding: utf-8 -*- """ ...

  2. Python:游戏:五子棋之人机对战

    本文代码基于 python3.6 和 pygame1.9.4. 五子棋比起我之前写的几款游戏来说,难度提高了不少.如果是人与人对战,那么,电脑只需要判断是否赢了就可以.如果是人机对战,那你还得让电脑知 ...

  3. SpringCloud-服务注册与发现(注册中心)

    SpringCloud-服务注册与发现(注册中心) 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:作者使用IDEA + Gradle 注:需要有一定的java&& ...

  4. k8s使用helm打包chart并上传到腾讯云TencentHub

    本文只涉及Helm的Chart操作,不会对其他知识进行过多描述.至于安装这块,麻烦自行百度吧,一大堆呢. 在容器化的时代,我们很多应用都可以部署在docker,很方便,而再进一步,我们还有工具可以对d ...

  5. Spring Boot整合Mybatis并完成CRUD操作

    MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...

  6. FontAwesome 图标字体库的使用

    在前端开发中,许多新手常会遇见一个问题,参考的网页上有类似下图的图标,但在资源里却找不到对应的文件,这是因为这些网页使用了图标库.这里介绍一种常见的图标库——FontAwesome的使用. 1.登录F ...

  7. gitbook 入门教程之使用 gitbook-cli 开发电子书

    gitbook 生成电子书主要有三种方式: gitbook-cli 命令行操作,简洁高效,适合从事软件开发的相关人员. gitbook-editor 编辑器操作,可视化编辑,适合无编程经验的文学创作者 ...

  8. Python开发:Python2和Python3的共存和切换使用

    从python2到python3,这两个版本可以说是从语法.编码等多个方面上都有很大的差别.为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容,也就是说许多针对早期Python2版 ...

  9. iptables/mysql设置指定主机访问指定端口

    本周,运维告知部署的服务被扫描发现漏洞,涉及的软件分别为mysql,ZooKeeper与Elasticsearch. 因为最近任务繁重,人力资源紧张,因此无法抽出更多时间调整代码,添加权限认证. 与软 ...

  10. python的进程与线程(一)

    摘要: 源地址:https://www.cnblogs.com/yuanchenqi/articles/6248025.html 如有侵权,立即删除 操作系统 学习进程和线程的知识,先了解一下底层操作 ...