泛型 即 将类型参数化, 由调用者 决定应该是什么类型, 当你确定参数的类型的时候 就不一定要用 泛型了

  1. //定义函数时 我不决定这些参数的类型
  2. //而是让调用者以参数的形式告知 我这里的函数参数应该是什么类型
  3. function sum<Type>(num:Type):Type{
  4. return num
  5. }
  6. //使用的时候再决定它的类型
  7. sum<number>(20)
  8. function identity<Type>(arg: Type): Type {
  9. return arg;
  10. }
  11. let myIdentity: <Type>(arg: Type) => Type = identity;
  12. interface Gener{
  13. <T>(arg:T):T
  14. }
  15. function id<T>(arg:T):T{
  16. return arg
  17. }
  18. let myI:Gener = id

常见的名称/使用习惯

T : Type缩写 类型

K、V : key和value 的缩写, 键值对

E : Element的缩写, 元素

O : Object的缩写,对象

  1. function foo<T,E,O>(arg1:T,arg2:E,arg3:O){
  2. }
  3. foo<number,string,boolean>(10,"abc",true)
  1. //遍历对象索引
  2. function foo<O>(args:O){
  3. for(let key in args){
  4. console.log(key)
  5. }
  6. }
  7. foo<object>({
  8. test:'123',
  9. abc:'123213'
  10. })
  11. //遍历数组
  12. function foo1<T>(...args:T[]){
  13. for(let key of args){
  14. console.log(key)
  15. }
  16. }
  17. foo1<number>(10,20,30)
接口使用泛型
  1. //可以定义默认类型
  2. interface IPerson<T1=string,T2=number>{
  3. name:T1
  4. age:T2
  5. }
  6. const p:IPerson<string,number> = {
  7. name:'why',
  8. age:18
  9. }
类与泛型
  1. //类与泛型
  2. class Point<T>{
  3. x:T
  4. y:T
  5. z:T
  6. constructor(x:T,y:T,z:T){
  7. this.x = x
  8. this.y = y
  9. this.z = z
  10. }
  11. }
  12. //类型推导
  13. const p1 = new Point("1.33.2","2.22.3","4.22.1")
  14. //显式声明
  15. const p2 = new Point<string>("1.33.2","123","4.22.1")
  16. const p3:Point<string> = new Point("1.33.2","123","4.22.1")
泛型的类型限制
  1. //泛型的类型约束
  2. //通过extends 对类型进行限制
  3. interface ILength{
  4. length:number
  5. }
  6. function getLength<T extends ILength>(arg:T){
  7. return arg.length
  8. }
  9. getLength("123")
泛型继承
  1. interface Props{
  2. length:number
  3. }
  4. const calcArray = <T extends Props,>(data:T):number=>{
  5. return data.length