typescript学习笔记--泛型(3)
发布时间:2020-12-15 00:41:21 所属栏目:C语言 来源:网络整理
导读:table class="javascript" tr class="li1" td class="ln"pre class="de1"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
<table class="javascript"> |
<tr class="li1">
<td class="ln"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
identityarg any any
? ? arg
?
虽然使用any类型后这个函数已经能接收任何类型的arg参数,
但是却丢失了一些信息:传入的类型与返回的类型应该是相同的。
因此,我们需要一种方法使用返回值的类型与传入参数的类型是相同的。
这里,我们使用了类型变量,它是一种特殊的变量,只用于表示类型而不是值。
?
identityTarg T T
? ? arg
?
类型变量T帮助我们捕获用户传入的类型(比如:number),之后我们就可以使用这个类型。
之后我们再次使用了T当做返回值类型。现在我们可以知道参数类型与返回值类型是相同的了。
?
二、使用泛型变量
使用泛型创建像identity这样的泛型函数时,编译器要求你在函数体必须正确的使用这个通用的类型。
换句话说,你必须把这些参数当做是任意或所有类型。
?
loggingIdentityTarg T T
? ? console.arg. ?
? ? arg
?
如果这么做,编译器会报错说我们使用了arg的.属性,但是没有地方指明arg具有这个属性。
记住,这些类型变量代表的是任意类型,所以使用这个函数的人可能传入的是个数字,而数字是没有.属性的。
?
loggingIdentityTarg ArrayT ArrayT
? ? console.arg. ?
? ? arg
?
你可以这样理解loggingIdentity的类型:
泛型函数loggingIdentity,接收类型参数T,和函数arg,它是个元素类型是T的数组,并返回元素类型是T的数组。
如果我们传入数字数组,将返回一个数字数组,因为此时T的的类型为number。
这可以让我们把泛型变量T当做类型的一部分使用,而不是整个类型,增加了灵活性。
?
三、泛型约束
相比于操作any所有类型,我们想要限制函数去处理任意带有.属性的所有类型。
只要传入的类型有这个属性,我们就允许,就是说至少包含这一属性。
为此,我们定义一个接口来描述约束条件。 创建一个包含.属性的接口,使用这个接口和关键字还实现约束:
?
Lengthwise
? ? length number
?
loggingIdentityT Lengthwisearg T T
? ? console.arg. ?
? ? arg
?
现在这个泛型函数被定义了约束,因此它不再是适用于任意类型:
我们需要传入符合约束类型的值,必须包含必须的属性:
loggingIdentitylength value
?
?
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!