首页 > 其他分享 >泛型

泛型

时间:2023-07-15 22:11:06浏览次数:15  
标签:return arg test 类型 使用 泛型

定义一个函数或类时,有些情况下无法确定其中要使用的具体类型(返回值、参数、属性的类型不能确定);

此时泛型便能够发挥作用;

举个例子:

function test(arg: any): any{
    return arg;
}

上例中,test函数有一个参数类型不确定,但是能确定的时其返回值的类型和参数的类型是相同的;

由于类型不确定所以参数和返回值均使用了any,但是很明显这样做是不合适的:

首先使用any会关闭TS的类型检查,其次这样设置也不能体现出参数和返回值是相同的类型;

泛型函数

创建泛型函数

function test<T>(arg: T): T{
    return arg;
}

这里的<T>就是泛型;

T是我们给这个类型起的名字(不一定非叫T),设置泛型后即可在函数中使用T来表示该类型;

所以泛型其实很好理解,就表示某个类型;

那么如何使用上边的函数呢?

使用泛型函数

方式一(直接使用):
test(10)

使用时可以直接传递参数使用,类型会由TS自动推断出来,但有时编译器无法自动推断时还需要使用下面的方式

方式二(指定类型):
test<number>(10)

也可以在函数后手动指定泛型;

函数中声明多个泛型

可以同时指定多个泛型,泛型间使用逗号隔开:

function test<T, K>(a: T, b: K): K{
  return b;
}

test<number, string>(10, "hello");

使用泛型时,完全可以将泛型当成是一个普通的类去使用;

泛型类

类中同样可以使用泛型:

class MyClass<T>{
  prop: T;

  constructor(prop: T){
      this.prop = prop;
  }
}

泛型继承

除此之外,也可以对泛型的范围进行约束

interface MyInter{
  length: number;
}

function test<T extends MyInter>(arg: T): number{
  return arg.length;
}

使用T extends MyInter表示泛型T必须是MyInter的子类,不一定非要使用接口类和抽象类同样适用;

标签:return,arg,test,类型,使用,泛型
From: https://www.cnblogs.com/ixtao/p/17557077.html

相关文章

  • Java5泛型的用法,T.class的获取和为擦拭法站台
    Java5的泛型语法已经有太多书讲了,这里不再打字贴书。GP一定有用,不然Java和C#不会约好了似的同时开始支持GP。但大家也清楚,GP和Ruby式的动态OO语言属于不同的意识形态,如果是一人一票,我想大部分的平民程序员更热衷动态OO语言的平白自然。但如果不准备跳槽到支......
  • 泛型 、entry词遍历方式、迭代器方式遍历
    示例代码publicclassFanxing<T>{//类的模板,类在编译时未确认privateTa;privateTb;publicTadd(){returna;}publicTsub(){returnb;}@Testpublicvoidfanxing(){List<String>list=newArra......
  • C#使用泛型方法将Datatable转换成List对象集合
     在项目中遇到需要将Datatable转换成对象的需求,通过dr[0]取下标这种获取,如果数据的顺序发生了改变则需要改变全部,工作量大foreach(DataRowdrindt.Rows){CheckDetailinfo=newCheckDetail();info.org_id=dr[0].ToStrin......
  • 反射操作泛型
    1、Java采用泛型擦除的机制来引入泛型。Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换的麻烦。但是,一旦编译完成,所有的和泛型有关的类型将全部擦除。2、为了通过反射操作这些类型以迎合实际开发的需要,Java新增ParameterizedType,GenericArrayType、Type......
  • c++模板相关学习--泛型编程
     类模板基础#define_CRT_SECURE_NO_WARNINGS#include<iostream>usingnamespacestd;#include<string>template<classNAMETYPE,classAGETYPE=int>//类模板中可以有默认参数classPerson{public:Person(NAMETYPEname,AGETYPEage){......
  • 泛型
    泛型泛型的概念编译时检查非法的类型数据结构,本质就是参数化类型,也就是所操作的数据类型被指定为类型数据结构.泛型类定义语法class类名称<泛型标识,泛型标识,...>{private泛型标识变量名;......}常用泛型标识:TEKV泛型类注意事项泛型类,如果没有......
  • 二-编程知识-泛型
    §泛型方法一般定义如下,即方法的前面加了个publicclassFClass{ public<T>List<T>f(Tt){...};}3种泛型参数推断方式:1、直接在f()前面加确定泛型fClass.<Integer>f(xxx)2、通过输入参数确定,下面这个推断为Integerintnumber=0;fClass.f(number)3、通过返......
  • Kotlin中的泛型:协变与逆变
    协变与逆变现在假设存在类A和类B,以及泛型类LIst<A>和泛型类LIst<B>,则协变和逆变的定义如下:协变如果A是B的子类,且List<A>是List<B>的子类,那么可以说泛型List<T>是协变的逆变如果A是B的子类,且List<B>是List<A>的子类,那么可以说泛型List<T>是逆变的Java中的泛型Java中的......
  • # 泛型 \<T>
    泛型是在C++中就已经存在的功能,而C#也自然继承了这一个非常重要的功能。泛型可以应用于完全一致类型的数据交流,但由于不能事先知道数据类型,因此只能做一些访问和相互赋值功能。例如如下代码voidswap<T>(refTa,refTb){Ttemp=a;a=b;b=temp;}//St......
  • C#学习笔记 -- 泛型
    泛型2、C#中的泛型泛型可以让多个类型共享一组代码允许声明类型参数化的代码,用不同的类型来实例化提供5种泛型:类、结构、接口、委托和方法classMyStack<T>{  intStackPointer=0;  T[]StackArray;  publicvoidPush(Tt){...}  public......