TypeScript入门-泛型
泛型
要创建一个可重用的组件,其中的数据类型就必须要兼容很多的类型,那么如何兼容呢,TypeScript提供了一个很好的方法:泛型
Hello World
要兼容多种数据格式,可能会有人想到any,即
function identify(arg: any): any{
    return arg;
}
使用any存在一个问题,有可能传入的值和返回的值不是同一种值,例如,传入数字,但是不确定返回的是什么值
要解决这个问题,我们需要引入类型变量-一种特殊的变量,只用于表示类型不表示值
function identity<T>(arg: T): T {
    return arg;
}
给identify添加了类型变量T,用来捕获传入值的类型,然后将返回值的类型也设置为T,就实现了传入值和返回值为同一类型值的需求
我们把identify这个函数叫做泛型,因为它适用于所有类型,并且不会有any类型存在的问题
使用泛型的方法有两种:
1、传入所有的参数,包括类型参数
let output = identify<string>('qwe');
2、利用类型推论--即编译器会根据传入的参数自动地帮助我们确定T的类型
let output = identify('qwe');
泛型变量
在泛型中,我们要合理正确的使用泛型变量T,要牢记T表示任何类型
错误使用:
function identify<T>(arg: T): T {
    console.log(arg.length);// Error: T doesn't have .length
    return arg;
}
在泛型中我们使用了length这个属性,但是T代表任何类型,所以有可能是number,而number是没有length属性的,所以会报错
如果想要使用length这个属性,我们可以创建数组
function identify<T>(arg: T[]): T[] {
    console.log(arg.length);// Error: T doesn't have .length
    return arg;
}
泛型类型
泛型函数的类型与非泛型函数的类型没什么不同,只是有一个类型参数在最前面,像函数声明一样:
function identify<T>(arg: T): T {
    return arg;
}
let myIdentify: <U>(arg: U) => U = identify;
从上面的代码中可以看出也可以使用不同的泛型参数名,只要在数量上和使用方式上能对应上就可以
当然也可以把泛型参数当做一个接口的参数,这样就可以知道这个接口具体用的是那种类型
interface GenericIdnetify<T>{
    (arg: T): T;
}
function identity<T>(arg: T): T{
    return arg;
}
let myGenericidentify: GenericIdnetify<string> = identity;
泛型类
泛型类看上去与泛型接口差不多。 泛型类使用( <>)括起泛型类型,跟在类名后面。
class GenericNumber<T> {
    zeroValue: T;
    add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };
泛型约束
在前面的泛型变量中遇到了一个问题,就是在泛型中调用参数的length时,如果参数没有Length属性会报错,而使用泛型约束,就是只有满足一定的条件才可以使用这个泛型
为此,我们定义一个接口来描述约束条件。 创建一个包含 .length属性的接口,使用这个接口和extends关键字还实现约束:
interface lengthwise{
    length: number;
}
function identity<T extends lengthwise>(arg: T): T{
    console.log(arg.length);
    return arg;
}
identity(123); //error
identity('qwe'); //true
当传入123时,没有length属性,就报错,而传入字符串qwe时则完全正确
参考资料:
TypeScript中文网 · TypeScript——JavaScript的超集
TypeScript入门-泛型的更多相关文章
- TypeScript入门实例
		前言 TypeScript是JavaScript的超集,微软公司开发,利用es6语法,实现对js的面向对象编程思想,写代码的时候会像强类型语言一样,指定参数类型.返回值类型,类型不对会报错,但编译后还 ... 
- TypeScript 入门自学笔记 — 类型断言(二)
		码文不易,转载请带上本文链接,感谢~ https://www.cnblogs.com/echoyya/p/14558034.html 目录 码文不易,转载请带上本文链接,感谢~ https://www ... 
- TypeScript 素描 - 泛型、枚举
		/* 泛型,好处多多的功能.不过这里最基本的就不打算说了,仅准备说一些 和C#不同的地方 */ /* 泛型接口 GenericIdentityFn 定义了方法的描述等 identity方法则是它的实现 ... 
- TypeScript入门指南(JavaScript的超集)
		TypeScript入门指南(JavaScript的超集) 你是否听过 TypeScript? TypeScript 是 JavaScript 的超集,TypeScript结合了类型检查和静态分析 ... 
- typescript 入门教程一
		##### 从今天开始,持续更新typescript入门教程系列.... 目前ts越来越火,主流的前端框架,好比*angular,vue 3*均是采用ts来编写,所有很多公司的项目都是用**ts**来 ... 
- TypeScript入门一:配置TS工作环境
		配置手动编译TS文件工作环境 配置webpack自动化打包编译工作环境(后面补充) 一.TypeScript入门学习引言 进入主题之前,首先说明这个系列的博客是我刚刚接触TypeScript的学习笔记 ... 
- TypeScript入门五:TypeScript的接口
		TypeScript接口的基本使用 TypeScript函数类型接口 TypeScript可索引类型接口 TypeScript类类型接口 TypeScript接口与继承 一.TypeScript接口的 ... 
- TypeScript 入门教程学习笔记
		TypeScript 入门教程学习笔记 1. 数据类型定义 类型 实例 说明 Number let num: number = 1; 基本类型 String let myName: string = ... 
- TypeScript入门文档
		typescript入门文档链接d地址:https://ts.xcatliu.com/basics/type-of-function.html 博主个人站点:www.devloper.top 
随机推荐
- 【Spring】使用Spring和AMQP发送接收消息(中)
			上篇讲了RabbitMQ连接工厂的作用是用来创建RabbitMQ的连接,本篇就来讲讲RabbitMQ的发送消息.通过RabbitMQ发送消息最简单的方式就是将connectionFactory Bea ... 
- 树链剖分-SPOJ375(QTREE)
			QTREE - Query on a tree You are given a tree (an acyclic undirected connected graph) with N nodes, a ... 
- sqrt()平方根计算函数的实现2——牛顿迭代法
			牛顿迭代法: 牛顿迭代法又称为牛顿-拉夫逊方法,它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法.多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特 ... 
- 对于反射中的invoke()方法的理解
			先讲一下java中的反射: 反射就是将类别的各个组成部分进行剖析,可以得到每个组成部分,就可以对每一部分进行操作 在比较复杂的程序或框架中来使用反射技术,可以简化代码提高程序的复用性. 讲的是Meth ... 
- javascript . 04 匿名函数、递归、回调函数、对象、基于对象的javascript、状态和行为、New、This、构造函数/自定义对象、属性绑定、进制转换
			匿名函数: 没有名字的函数,函数整体加小括号不报错, 函数调用 : a:直接调用 (function (){函数体}) ( ) ; b:事件绑定 document.onlick = functio ... 
- [python爬虫]爬取学校教务处成绩
			学校教务处网站 登陆窗口 表单数据 观察登陆窗口和提交的表单数据可知只要将账号.密码.验证码正确赋值提交即可模拟登陆. 账号和密码都有,问题的关键就在验证码上. 右键验证码图片审查观察源码如下图: 刚 ... 
- ajax 原理----初级篇
			一.贴dome,ajax三大步 <!DOCTYPE html> <html lang="en"> <head> <meta charset ... 
- ASP.NET Core:使用Dapper和SwaggerUI来丰富你的系统框架
			一.概述 1.用VS2017创建如下图的几个.NET Standard类库,默认版本为1.4,你可以通过项目属性进行修改,最高支持到1.6,大概五月份左右会更新至2.0,API会翻倍,很期待! 排名分 ... 
- js 操作 cookie
			js 操作 cookie 的方法如下: //设置cookie function setCookie(cname, cvalue, exdays) { var d = new Date(); d.set ... 
- 在centOS7.2里安装virtualenv和flask
			1) 安装pip工具 #wget https://bootstrap.pypa.io/get-pip.py #python get-pip.py 2) 安装virtualenv,并创建一个开发环境 # ... 
