TypeScript入门-泛型
来源:互联网 发布:生有涯而知无涯的意思 编辑:程序博客网 时间:2024/06/06 00:50
泛型
要创建一个可重用的组件,其中的数据类型就必须要兼容很多的类型,那么如何兼容呢,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); //erroridentity('qwe'); //true
当传入123时,没有length属性,就报错,而传入字符串qwe时则完全正确
- TypeScript入门-泛型
- typescript入门,typescript特性
- typeScript入门
- TypeScript入门
- TypeScript入门
- TypeScript 入门指南
- TypeScript入门-语法篇
- TypeScript 入门11
- typescript 快速入门
- Typescript快速入门
- TypeScript入门01
- TypeScript入门02
- TypeScript快速入门
- 一:TypeScript入门
- 一:TypeScript入门
- typescript 入门笔记
- TypeScript快速入门&Hello world
- TypeScript入门-3.参数类型
- 人工机器:作为归纳系统的深度学习
- IOS基础绘图
- JPA hibernate 异常 id变更报错。identifier was altered
- Java 并发工具包 java.util.concurrent 用户指南
- C/C++学习(1)面向对象的多态性问题、虚函数调用
- TypeScript入门-泛型
- ASP.NET跨域请求中的问题【CORS】
- 安装angular-cli出现(未能加载VCBuild.exe)错误的解决办法
- jenkins参数化构建过程
- linux下安装jdk
- Lucene 搜索方式
- Ubuntu下安装mongodb及一些基本操作
- linux:自己制作编译工具链crosstool-0.43
- Caffe安装错误及其解决方法