TypeScript中的范型

2023-12-27 09:32
文章标签 typescript 范型

本文主要是介绍TypeScript中的范型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、定义

比如我们有一个函数,如果不使用范型是这样的

function getData(arg: number): number {return arg;
}

它只能传入number类型,如果我们要传入一个string类型的是编译不通过的,所以我们可以写另一个函数或者用any类型

function getData1(arg: string): string {return arg;
}
function getData2(arg: any): any {return arg;
}

那么问题来了,如果重新写那么我们就不能做到复用了,如果用any就不能保证传进去的类型和传出来的类型统一,所以我们有了范型

function getData<T>(arg: T): T {return arg;
}
getData<number>(123)
getData<string>(123)
getData(false)//利用了类型推论,编译器会根据传入的参数自动地帮助我们确定T的类型

T:表示范型,具体什么类型是调用的这个方法的时候决定的(注意:T也可以是任意其他字母)
所以范型可以支持不确定的数据类型,传入的参数和返回值的类型一致。

二、范型变量

如果我们想打印一个数组的长度

function getLength<T>(arg: T): T {console.log(arg.length);  // Error: T doesn't have .lengthreturn arg;
}

如果这么做,编译器会报错说我们使用了arg的.length属性,但是没有地方指明arg具有这个属性。 记住,这些类型变量代表的是任意类型,所以使用这个函数的人可能传入的是个数字,而数字是没有.length属性的。

现在假设我们想操作T类型的数组而不直接是T。由于我们操作的是数组,所以.length属性是应该存在的。 我们可以像创建其它数组一样创建这个数组:

function getLength<T>(arg: T[]): T[] {console.log(arg.length);  // Array has a .length, so no more errorreturn arg;
}

三、范型类

泛型类使用(<>)括起泛型类型,跟在类名后面。

class Minclass<T> {public list: T[] = []add(value: T):void {this.list.push(value)}min():T{let minNum = this.list[0]for(let i =0; i < this.list.length; i++){if(minNum > this.list[i]){minNum = this.list[i]}}return minNum}
}
let m = new Minclass<number>()
m.add(2)
m.add(6)
m.min() //2
let s = new Minclass<string>()
s.add('m')
s.add('c')
s.min()//c

四、范型接口

interface ConfigFn{<T>(value:T):T
}
let getData:ConfigFn = function<T>(value:T):T{return value
}

通用范型接口:

function getData<T>(value:T):T{return value
}
interface ConfigFn<T>{(value:T):T
}
let getData:ConfigFn<string> = getData
let getData1:ConfigFn<number> = getData

五、在泛型约束中使用类型参数

class User{username: stringpassword: string
}
class Mysql{add (user:User):boolean{console.log(user)return true}
}
let u = new User()
u.username = '张三'
u.password = '123'
let m = new Mysql()
m.add(u)

我们可以通过范型约束来更好的实现上面的代码

class Mysql<T>{add(info:T):boolean{console.log(Info)return true}
}
let u = new User()
u.username = '张三'
u.password = '123'
let my = new Mysql<User>()
my.add(u)

这篇关于TypeScript中的范型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/542686

相关文章

创建 typescript 项目.md

有时候需要创建一个最简单的 typescript 项目来验证一些东西,这里记录一下如何创建一个最简单的 typescript 项目。 创建并初始化项目 $ mkdir my-typescript-project$ cd my-typescript-project$ npm init -y$ npm install typescript ts-node @types/node --save

TypeScript数据结构与算法系列(一) —— 链表

TypeScript目录 链表常用操作1.初始化链表2. 插入节点3. 删除节点4. 访问节点5. 查找节点 图源:你好算法 内存空间是所有程序的公共资源,在一个复杂的系统运行环境下,空闲的内存空间可能散落在内存各处。我们知道,存储数组的内存空间必须是连续的,而当数组非常大时,内存可能无法提供如此大的连续空间。此时链表的灵活性优势就体现出来了。 链表(linked list)

VueSax-解决Vue3报错问题,并支持typescript

以下为坑点 根据官方提示,本人在vue3+typescript的项目中添加了vuesax的组件依赖 根据正常的导入依赖思路编写代码,发现typescript一直报 查询vuesax的目录文件发现存在ts文件,于是乎觉得是自己的问题,就查阅gpt与网上资料,查了一晚上加入各种方法,都没有解决,于是乎选择javascript进行测试,发现还是不行! js里虽然不报错,但是在页面

Kotlin 范型之协变、逆变、不变

一. 前言 Kotlin 中类和类型是不一样的概念。型变是指类型转换后的继承关系。Kotlin 的型变分为逆变、协变和不变。 二. 协变 如果 A 是 B 的子类型,并且Generic<A> 也是 Generic<B> 的子类型,那么 Generic<T> 可以称之为一个协变类。 2.1Java 上界通配符<? extends T> Java 的协变通过上界通配符实现。 如果

Vue3 + TypeScript 实现防抖(Debounce)和节流(Throttle)

在Vue3项目中结合TypeScript使用防抖(Debounce)和节流(Throttle)技术,可以有效提升应用的性能和用户体验,尤其是在处理频繁触发的事件(如滚动、窗口大小调整、输入框内容变化等)时。下面将详细介绍这两种技术的原理、使用方法以及适用场景。 一、防抖(Debounce) 原理: 防抖技术通过延迟函数的执行来减少函数的调用频率。在事件被触发n秒后再执行回调,如果在这

Typescript实现react-redux的useSelector和useDispatch的状态定义

背景:react中使用typescript,在引入redux之后很多状态定义有问题,记录下来(文章记录学习react-redux过程中的踩坑)。 1.useSelector时,state语法报错,类型为unknown,如下图 我的store状态设置的很简单,两个模块导出,只在state中定义了一个基础类型 在组件中使用useSelector取state中的值,然后报state类型未知 我

TypeScript中的函数与类

TypeScript中的类 传统的JavaScript程序使用函数和基于原型的继承来创建可重用的组件,但对于熟悉使用面向对象方式的程序员来讲就有些棘手,因为他们用的是基于类的继承并且对象是由类构建出来的。 从ECMAScript 2015,也就是ECMAScript 6开始,JavaScript程序员将能够使用基于类的面向对象的方式。 使用TypeScript,我们允许开发者现在就使用这些特性,

Typescript 常用变量类型声明

函数声明变量 // 基础类型(number、boolean、string)const int = (arg1: number) {// ...}// 数组类型const arr1 = (arg1: number[]) {// ...}// 另一种写法,使用泛型const arr2 = (arg1: Array<number>) {// ...}// 任意类型(any)// a

VUE3+FLASK+TYPESCRIPT(实习接触,学习并自主实现)

开头         不同于笔者在学校自学简单的html+js+css的模式,加入了前端框架VUE3真的是一个非常方便的工具,而且本人主攻于c++方向,像ts这种更严格的语法标准反而更加比原生js更能让我接受,由于这三个都是本人没接触的库框架和语言,所以笔者采取的是先学习在边做项目边巩固的方法。 VUE3初始化         下面提供一个简单的VUE3+FLASK案例,旨在入门 打通Vu

Typescript 使用 Jest 进行单元测试

参考文章:快速开始·Jest 安装所需依赖:npm install --save-dev ts-node jest @types/jest ts-jest Jest 转换 TypeScript 代码需要ts-node添加并配置 Jest 配置文件:jest.config.ts // jest.config.tsmodule.exports = {// TypeScript 代码预处理pres