中文网:https://www.tslang.cn/

官网:http://www.typescriptlang.org/

目录:

泛型的定义

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

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

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

function getData (val:string):string {
return val;
}

只能返回string类型的数据,要求能同时返回 string 类型和 number 类型

function getData1 (val:string):string {
return val;
}
function getData2 (val:number):number {
return val;
}

代码冗余,any 类型可以解决这个问题。

function getData (val:any):any {
return val;
}
getData(124);
getData('124');

但是 any 相当于放弃了类型检查。没法实现传入什么,返回什么。比如:传入 number 类型必须返回 number 类型,传入 string 类型必须返回 string 类型。

function getData (val:any):any {
return val + '---';
}
getData(124); // 传入 number,返回 string

泛型:可以支持不特定的数据类型。要求:传入的参数和返回的参数一致。

T表示泛型,具体什么类型是在调用这个方法的时候决定的

泛型函数

function getData<T> (val:T):T {
return val;
}
getData<number>(124);
getData<string>('abc');
// getData<number>('abc'); // 错误

放回值可以是任意类型

function getData<T> (val:T):any {
return val + '***';
}
getData<number>(124); // 参数必须是数字
getData<string>('abc');

泛型类

比如有个最小堆算法,需要同时支持返回数字和字符串 a-z 两种类型。通过类的泛型来实现

class minClass {
list:number[] = []; add (val:number):void {
this.list.push(val);
} min ():number {
let minNum:number = this.list[0];
for(let i = 0; i < this.list.length; i++) {
if(minNum > this.list[i]){
minNum = this.list[i];
}
}
return minNum;
}
}
let m = new minClass();
m.add(3);
m.add(2);
m.add(23);
console.log(m.min()); // 2

正常的类只能实现一种类型。用泛型解决,支持 number 和 string。

class minClass<T> {
list:T[] = []; add (val:T):void {
this.list.push(val);
} min ():T {
let minNum = this.list[0];
for(let i = 0; i < this.list.length; i++) {
if(minNum > this.list[i]){
minNum = this.list[i];
}
}
return minNum;
}
}
let m1 = new minClass<number>(); // 实例化类,并且指定了类的 T 代表的类型是 number
m1.add(3);
m1.add(2);
m1.add(23);
console.log(m1.min()); // 2 let m2 = new minClass<string>(); // 实例化类,并且指定了类的 T 代表的类型是 string
m2.add('a');
m2.add('d');
m2.add('f');
console.log(m2.min()); // a

泛型接口

函数类型接口

interface configFn {
(val1:string, val2:string):string;
}
let setData:configFn = function (value1:string, value2:string):string { // 参数名可以和接口中的不一致,但是参数类型必须一致
return value1 + value2;
}
setData('1', '2');

泛型接口实现方式1:

interface configFn {
<T>(val:T):T;
}
let getData:configFn = function<T> (value:T):T {
return value;
}
getData<string>('abc');
getData<number>(123);

泛型接口实现方式2:

interface configFn<T> {
(val:T):T;
}
let getData:configFn<string> = function<T> (value:T):T {
return value;
}
getData('abc');
getData(123); // 错误

这是最后一篇,之后更深入的学习和应用了,再继续。_

Typescript 学习笔记七:泛型的更多相关文章

  1. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  2. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  3. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. Typescript 学习笔记一:介绍、安装、编译

    前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...

  7. TypeScript学习笔记(八):1.5版本之后的模块和命名空间

    我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...

  8. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

随机推荐

  1. 记账本,C,Github,Dao

    package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSe ...

  2. spark快速开发之scala基础之5高阶函数,偏函数,闭包

    高阶函数 高阶函数就是将函数作为参数或者返回值的函数. object function { def main(args: Array[String]): Unit = { println(test(f ...

  3. wdk驱动开发的特点

    本文介绍WDK开发的一些特点.与应用层开发的差异性,不能混为一谈. 一.函数的调用点 在内核编程中,一个函数往往有多个调用点,而应用层中一个函数一般只在main里面有调用点.内核函数调用点一般在: 1 ...

  4. python--第十二天总结(Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy)

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  5. Linux上web服务器搭建

    安装php依赖包: yum -y install gcc gcc++ libxml2 libxml2-devel yum install gcc make gd-devel libjpeg-devel ...

  6. jqGrid的userData的用法!!!

    在一次项目中想从后台自定义一些返回值传回jqGrid,所以就想到了jqGrid的这个userData属性,但是真的是坑了我好惨,这里记录一下! 1.首先看说明,这个jsonReader的默认配置,us ...

  7. FortiGate双链路不同运营商上网配置

    1.防火墙端口配置 2.LLB配置

  8. [leetcode]53. Maximum Subarray最大子数组和

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  9. Cannot resolve method

    1.问题描述: 本人idea下拉项目,结果impl里的类满屏的红色 2.解决方法 步骤: File --> Settings --> Plugins -->搜索并安装lom即可

  10. stark组件开发之批量操作

    class UserInfoHandler(StartHandler): ....... # 批量操作功能的列表,添加则显示, 使用此功能.需要将StartHandler.display_checkb ...