首页 > 其他分享 ># TypeScript 泛型

# TypeScript 泛型

时间:2023-12-26 17:45:19浏览次数:29  
标签:arr TypeScript ed number value 类型 泛型

TypeScript 泛型

参考资料:https://ts.xcatliu.com/advanced/generics.html

泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。

案例

定义一个函数,传入两个参数,第一个参数是数据,第二个参数是数量。
函数的作用是根据数量,产生对应个数的数据,存放在一个数组中。
即:( "我是ed." , 3 ) => [ "我是ed." , "我是ed." , "我是ed." ]

OK ,开始编写代码,首先我们确定数量一定是 number 类型,但是数据不一定是什么类型,所以我们先假设传进来的是 number 类型:

/**
 * 定义一个函数,传入两个参数,第一个参数是数据,第二个参数是数量。
 * 函数的作用是根据数量,产生对应个数的数据,存放在一个数组中。
 * 即:`( "我是ed." , 3 )   =>  [ "我是ed." , "我是ed." , "我是ed." ]`
 */

// 假设传进来的value是数字
function getArr(value: number, count: number): number[] {
  const arr: number[] = [];
  for (let i = 0; i < count; i++) {
    arr.push(value);
  }
  return arr
}
console.log(getArr(123, 3))

ok,如果是数字的话,没问题,我们编译执行一下看结果:

在这里插入图片描述

OK,没有一点儿问题。

接下来,如果 value 传入的是字符串怎么办?首先一点,原则上不推荐使用 any,可以使用泛型,在定义的时候不需要确定类型,而是使用的时候在确定。

// T 表示任意输入的类型
function getArr<T>(value: T, count: number): T[] {
  const arr: T[] = [];
  for (let i = 0; i < count; i++) {
    arr.push(value);
  }
  return arr
}
// 原则上不推荐使用 any
// 可以使用泛型,在定义的时候不需要确定类型,而是使用的时候在确定
console.log(getArr("我是ed.", 3))

然后我们同样编译执行一下:

在这里插入图片描述

完美!奈斯!成功解决问题!而且我们把鼠标移上去之后,发现 ts 已经帮我们做了类型推论:

在这里插入图片描述

如果我们确认返回类型的话,我们也可以提前定义返回类型:

console.log(getArr<string>("我是ed.", 3))
console.log(getArr<number>(25, 5))

如果没有确定类型的话,就会走类型推断,它会自动推断返回的类型。

注意,泛型使用的 T 不是绝对的,可以修改成别的内容,但是默认都写作 T

多个类型参数

定义泛型的时候,可以一次定义多个类型参数。

假设我们现在有一个元组有两个元素,元素类型不确定,我们经过一个函数的处理,将两个元素调个儿返回。
即:[ "我是ed." , 25 ] => [ 25 , "我是ed." ]

直接编写代码吧:

function updateArr<T, U>(t: [T, U]): [U, T]{
  return [t[1], t[0]]
}
console.log(updateArr(["我是ed.", 25]))
console.log(updateArr([true, 145]))

看一下编译后的执行结果:

在这里插入图片描述

没有问题,我们鼠标移入看一下,ts 也已经为我们做了类型推断:

在这里插入图片描述

泛型约束

在函数内部使用泛型变量的时候,由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法。

// 获取参数的长度
// 使用泛型约束,约束这个任意输入的类型,必须要有length属性
interface ILength{
  length: number
}
// 通过接口约束泛型
function getLength<T extends ILength>(x:T) :number {
  return x.length
}
console.log(getLength(123)) // 报错

通过接口,对泛型进行了约束,T extends ILength 的意思可以理解为,我不知道传入的是什么类型,但是她受到了接口约束,要求传入的参数必须包含 length 属性,如果没有,就不行,getLength(123) ,很明显传入的 123 数字没有 length 属性,所以会报错!

在这里插入图片描述

泛型接口

可以使用含有泛型的接口来定义函数的形状。

// 先定义一个泛型接口
interface IArr {
  <T>(value: T, count: number): Array<T>
}
// T 表示任意输入的类型
let getArr1: IArr = function getArr<T>(value: T, count: number): T[] {
  const arr: T[] = [];
  for (let i = 0; i < count; i++) {
    arr.push(value);
  }
  return arr
}
// 使用
console.log(getArr1("123", 3))

泛型类

与泛型接口类似,泛型也可以用于类的类型定义中。

class GenericNumber<T> {
    zeroValue: T;
    add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

标签:arr,TypeScript,ed,number,value,类型,泛型
From: https://www.cnblogs.com/wjw1014/p/17928920.html

相关文章

  • Java泛型详解
    Java泛型详解转载自:Java中的泛型(两万字超全详解)一、泛型概述1.什么是泛型?为什么要试用泛型?泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参列表,普通方法的形参列表中,每个形参的数据类型的确定的,而变量是一个参数。在调用普通方法时需要传入对应形参数据类型的......
  • # TypeScript 中的类使用
    TypeScript中的类使用学习资料:https://ts.xcatliu.com/advanced/class.html传统方法中,JavaScript通过构造函数实现类的概念,通过原型链实现继承。而在ES6中,我们终于迎来了class。TypeScript除了实现了所有ES6中的类的功能以外,还添加了一些新的用法。类的概念虽然Ja......
  • [转]TypeScript编写类继承函数相关的代码
    TypeScript编写类,继承、函数相关的代码classPerson{privatename:stringprivateage:Numberconstructor(name:string,age:Number){this.name=name;this.age=age}publicgetPersonInfo():string{return`Myname......
  • # TypeScript 枚举 enum
    TypeScript枚举enum学习资料:https://ts.xcatliu.com/advanced/enum.html枚举(Enum)类型用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等。枚举赋值简单理解就是给一组数值赋予名称。//枚举对象enumNumberType{one=1,two,three,fo......
  • 泛型仓储+服务架构落地
    一、前言本文章只为作学习记录使用,文中图片或引用均为网上摘抄,如涉嫌侵权请联系本人删除。二、准备工作1.VisualStudio20222.Windows11、.NET6环境三、什么是仓储仓储(Repository)模式自2004年首次作为领域驱动模型DDD设计的一部分引入,仓储本质上是提供提供数据的抽象,以......
  • moment js/nodejs/typescript TypeError: moment_1.default is not a function报错解
    引入问题造成的,改一下就好了importmomentfrom'moment'改为constmoment=require('moment');测试一下letret=moment(1617678420000).format('YYYY年MM月DD日hh时mm分ss秒')console.log('日期')console.log(ret)......
  • TypeScript基础
    基础类型letstr:string="Hello,TypeScript";letnum:number=42;letbool:boolean=true;定义一个接口interfacePerson{name:string;age:number;}functiongreet(person:Person):string{return`Hello,${person.name}!Youare${person.age}......
  • Java中的泛型
    1.为什么要有泛型泛型可以理解为标签,比如药店里会在某一类药品处贴上标签方便寻找。定义:把元素的类型设计成一个参数,这个类型参数叫做泛型。比如List<String>这表明该List只能保存字符串类型的对象那么使用或不使用泛型有什么区别呢?看下面的代码@Testpublicvoidtest(){ArrayLis......
  • # TypeScript 类型声明、数据类型
    TypeScript类型声明、数据类型好烦数据类型JavaScript的类型分为两种:原始数据类型(Primitivedatatypes)和对象类型【引用数据类型】(Objecttypes)。原始数据类型包括:布尔值、数值、字符串、null、undefined以及ES6中的新类型Symbol和ES10中的新类型BigInt。类型声......
  • # 1. TypeScript 简介
    1.TypeScript简介烦教程地址教程资源:https://ts.xcatliu.com/introduction/what-is-typescript.html#link-1中文官网:https://www.typescriptlang.org/TypeScript特点JS的超集包含JS的所有元素能够运行JS代码支持ES语法是一种开源、跨平台的编程语言编译器......