说明

在使用泛型进行编写代码的时候,如果需要涉及到一些方法的使用,可能编译过程就会报错,这个时候就可以使用extends让泛型继承一些其他类型,从而实现需求。

使用

先来看下面这种情况:

  1. function getLength(arg: string):number {
  2. return arg.length;
  3. }
  4. // 调用函数
  5. getLength('hello,world');

上面这个函数接收一个字符串参数,返回一个number类型。调用了函数之后,传入一个字符串,而函数中返回了一个字符串的长度。

上面的代码很简单,但是如果传递的参数换个类型,上面的函数将不能满足需求。这个时候就可以使用泛型。

  1. function getLength<T>(arg: T):number {
  2. return arg.length;
  3. }

但是代码更改完毕之后,发现程序依然在报错。

image.pngimage.png
此时出现的问题是因为T的类型并不确定,所以会出现这样的问题。

此时解决这样的问题,可以使用extends继承。让使用的T继承需要的类型。例如:

  1. function getLength<T extends string | any[]>(arg: T):number {
  2. return arg.length;
  3. }

上面的代码中,让T继承了字符串类型和数组类型。此时不管是数组类型也好还是字符串类型也好都是具有length属性的。

当然除了继承这些固有类型以外,还可以继承一个自定义的对象。

  1. type obj = {
  2. length: number,
  3. }
  4. function getLength<T extends obj>(arg: T):number {
  5. return arg.length;
  6. }

在调用函数的时候传递数据的时候,也可以如下:

  1. getLength('hello,world');
  2. getLength<string|any[]>(['aaa', 'bbb', 'ccc']);

注意

无。

总结

如果想要让泛型拥有更多的约束,可以使用extends来继承其他类型,从而添加约束规则。