泛型

要创建一个可重用的组件,其中的数据类型就必须要兼容很多的类型,那么如何兼容呢,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入门-泛型的更多相关文章

  1. TypeScript入门实例

    前言 TypeScript是JavaScript的超集,微软公司开发,利用es6语法,实现对js的面向对象编程思想,写代码的时候会像强类型语言一样,指定参数类型.返回值类型,类型不对会报错,但编译后还 ...

  2. TypeScript 入门自学笔记 — 类型断言(二)

    码文不易,转载请带上本文链接,感谢~ https://www.cnblogs.com/echoyya/p/14558034.html 目录 码文不易,转载请带上本文链接,感谢~ https://www ...

  3. TypeScript 素描 - 泛型、枚举

    /* 泛型,好处多多的功能.不过这里最基本的就不打算说了,仅准备说一些 和C#不同的地方 */ /* 泛型接口 GenericIdentityFn 定义了方法的描述等 identity方法则是它的实现 ...

  4. TypeScript入门指南(JavaScript的超集)

    TypeScript入门指南(JavaScript的超集)   你是否听过 TypeScript? TypeScript 是 JavaScript 的超集,TypeScript结合了类型检查和静态分析 ...

  5. typescript 入门教程一

    ##### 从今天开始,持续更新typescript入门教程系列.... 目前ts越来越火,主流的前端框架,好比*angular,vue 3*均是采用ts来编写,所有很多公司的项目都是用**ts**来 ...

  6. TypeScript入门一:配置TS工作环境

    配置手动编译TS文件工作环境 配置webpack自动化打包编译工作环境(后面补充) 一.TypeScript入门学习引言 进入主题之前,首先说明这个系列的博客是我刚刚接触TypeScript的学习笔记 ...

  7. TypeScript入门五:TypeScript的接口

    TypeScript接口的基本使用 TypeScript函数类型接口 TypeScript可索引类型接口 TypeScript类类型接口 TypeScript接口与继承 一.TypeScript接口的 ...

  8. TypeScript 入门教程学习笔记

    TypeScript 入门教程学习笔记 1. 数据类型定义 类型 实例 说明 Number let num: number = 1; 基本类型 String let myName: string = ...

  9. TypeScript入门文档

    typescript入门文档链接d地址:https://ts.xcatliu.com/basics/type-of-function.html 博主个人站点:www.devloper.top

随机推荐

  1. WebX框架学习笔记之一

    Webx是什么? Webx是一套基于Java Servlet API的通用Web框架.它在Alibaba集团内部被广泛使用.从2010年底,向社会开放源码. Webx的发展历史 2001年,阿里巴巴内 ...

  2. Hibernate之关联映射(一对多和多对一映射,多对多映射)

    ~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...

  3. Java线程池使用和分析(一)

    线程池是可以控制线程创建.释放,并通过某种策略尝试复用线程去执行任务的一种管理框架,从而实现线程资源与任务之间的一种平衡. 以下分析基于 JDK1.7 以下是本文的目录大纲: 一.线程池架构 二.Th ...

  4. Android中查看布局文件中的控件(view,id)在哪里被调用(使用)

    在阅读别人的代码时通常是很痛苦的,有时很想要看一看布局中的控件在哪里被调用了,为之很苦恼 在这里提供一种方法.   复制要查看的控件ID,到R文件中搜索到该ID,   接下来就好办的了,选中ID按下C ...

  5. 效率神器 Workflow 实例分享

    WorkflowShare Workflow实例分享,Github链接:WorkflowShare logo.jpg 苹果公司收购 Workflow 并将其完全免费,作为一款效率类 APP,Workf ...

  6. pyqt系列原创入门教程

    pyqt4入门教程 python pyqt4 PyQt是一个创建GUI应用程序的工具包.它是Python编程语言和Qt库的成功融合.Qt库是目前最强大的库之一. 通过pyqt可以实现很多我们想要的功能 ...

  7. 走入PHP-declare、ticks、encoding、include

    declare 结构用来设定一段代码的执行指令.declare 的语法和其它流程控制结构相似(该代码为语法格式,不是代码案例,无需敲打该代码): declare (directive) stateme ...

  8. TCP的三次握手(建立连接)与 四次挥手(关闭连接)

    一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图: TCP报文格式上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位 ...

  9. C# 索引同时含有数字和字符串的集合 同时具备IList和IDictionary的特点

    同时具备IList和IDictionary的特点的集合 [Serializable] public class MyCollection:IList { private readonly Dictio ...

  10. java里的日期时间

    为了更好理解java的日期时间类,在这里我们先介绍一下关于历法.标准时间的一些概念. 历法有很多种,我们大中华上下五千年,自然也有自己的历法,生活中我们通常把自己传统的历法叫做农历,也有人叫它阴历或夏 ...