Typescript 学习笔记七:泛型
目录:
- Typescript 学习笔记一:介绍、安装、编译
- Typescript 学习笔记二:数据类型
- Typescript 学习笔记三:函数
- Typescript 学习笔记四:回忆Es5 中的类
- Typescript 学习笔记五:类
- Typescript 学习笔记六:接口
- Typescript 学习笔记七:泛型
泛型的定义
泛型:软件工程中,我们不仅要创建一致的定义良好的 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 学习笔记七:泛型的更多相关文章
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记二:数据类型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记一:介绍、安装、编译
前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...
- TypeScript学习笔记(八):1.5版本之后的模块和命名空间
我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
随机推荐
- linux check
建议安装chkrootkit.rkhunter.Lynis.ISPProtect这类安全工具,定期做扫描
- ArcGIS自定义工具箱-修复损坏的工作空间
ArcGIS自定义工具箱-修复损坏的工作空间 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:替换数据源的工作空间 用途:针对损坏的数据源,批量进行修复 案例数 ...
- MySQL的安装流程与入门
MySQl是一种关系型数据库,存放的是文字数据,它是以“表”的形式进行存储的.由于MySQl的实用性和不收费,它在世界上是应用最多的数据库,但是,它不支持大量数据写入.接下来,我将为大家分享一下我学习 ...
- 解决yum安装ftp提示仓库 的 GPG 密钥已安装,但是不适用于此软件包。
遇到的问题: 在linux系统使用yum install ftp安装ftp,报以下错误 warning: rpmts_HdrFromFdno: Header V3 RSA/SHA1 Signature ...
- 20175314 《Java程序设计》第一周学习总结
20175314 <Java程序设计>第一周学习总结 教材学习内容总结 除了学院统一购买的<Java 2 实用教程(第5版)>我还在网上买了一本<Head ...
- 用归并排序或树状数组求逆序对数量 poj2299
题目链接:https://vjudge.net/problem/POJ-2299 推荐讲解树状数组的博客:https://blog.csdn.net/int64ago/article/details/ ...
- HDU-1160.FatMouse'sSpeed.(LIS变形 + 路径打印)
本题大意:给定一定数量的数对,每个数保存着一只老鼠的质量和速度,让你求出一个最长序列,这个序列按照质量严格递增,速度严格递减排列,让你输出这个序列的最长长度,并且输出组成这个最长长度的序列的对应的老鼠 ...
- [leetcode]44. Wildcard Matching万能符匹配
Given an input string (s) and a pattern (p), implement wildcard pattern matching with support for '? ...
- input type="file"多图片上传 原生html传递的数组集合
单个的input type="file"表单也是可以实现多图片上传的 代码如下: <form action="manypic.php" method=&q ...
- python基础之Day15
一.函数递归 什么是函数递归: 函数递归调用是一种特殊的嵌套调用,在调用一个函数的过程中,又直接或间接地调用了该函数本身. 其中,函数的递归有明确的结束条件,不能无限制的调用,否则会撑破内存,在Pyt ...