首页 技术 正文
技术 2022年11月11日
0 收藏 303 点赞 4,024 浏览 1767 个字

泛型

要创建一个可重用的组件,其中的数据类型就必须要兼容很多的类型,那么如何兼容呢,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——JavaScript的超集

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,090
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,567
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,415
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,187
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,823
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,906