说明
在使用泛型进行编写代码的时候,如果需要涉及到一些方法的使用,可能编译过程就会报错,这个时候就可以使用extends让泛型继承一些其他类型,从而实现需求。
使用
先来看下面这种情况:
function getLength(arg: string):number {return arg.length;}// 调用函数getLength('hello,world');
上面这个函数接收一个字符串参数,返回一个number类型。调用了函数之后,传入一个字符串,而函数中返回了一个字符串的长度。
上面的代码很简单,但是如果传递的参数换个类型,上面的函数将不能满足需求。这个时候就可以使用泛型。
function getLength<T>(arg: T):number {return arg.length;}
但是代码更改完毕之后,发现程序依然在报错。


此时出现的问题是因为T的类型并不确定,所以会出现这样的问题。
此时解决这样的问题,可以使用extends继承。让使用的T继承需要的类型。例如:
function getLength<T extends string | any[]>(arg: T):number {return arg.length;}
上面的代码中,让T继承了字符串类型和数组类型。此时不管是数组类型也好还是字符串类型也好都是具有length属性的。
当然除了继承这些固有类型以外,还可以继承一个自定义的对象。
type obj = {length: number,}function getLength<T extends obj>(arg: T):number {return arg.length;}
在调用函数的时候传递数据的时候,也可以如下:
getLength('hello,world');getLength<string|any[]>(['aaa', 'bbb', 'ccc']);
注意
总结
如果想要让泛型拥有更多的约束,可以使用extends来继承其他类型,从而添加约束规则。
