iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >typeScript 泛型使用和泛型接口结合
  • 215
分享到

typeScript 泛型使用和泛型接口结合

2024-04-02 19:04:59 215人浏览 薄情痞子
摘要

目录1、泛型是啥?2、泛型类型3、泛型接口4、泛型类5、泛型约束6、泛型参数默认类型7、泛型条件类型typeScript 中新增的泛型概念、泛型使用、泛型与接口结合: 在实际应用中

typeScript 中新增的泛型概念、泛型使用、泛型与接口结合:

在实际应用中可能会遇到求最小值的问题,比如求数组中的最小值。

ts 中的就需要写两种方式,一种针对 number,另外一种针对字符串

这样写不利于代码重用,项目较大时,性能较差,同时工作效率也低,所以在 ts 中引入了泛型概念。

function getMin1(arr:number[]):number {
 let min = arr[0]
 for (var i = 1; i < arr.length; i++){
  if (min > arr[i]) {
   min = arr[i]
  }
 }
 return min
}
console.log(getMin1([1, 2, 3, 4]));
function getMin2(arr:string[]):string {
 let min = arr[0]
 for (var i = 1; i < arr.length; i++){
  if (min > arr[i]) {
   min = arr[i]
  }
 }
 return min
}
console.log(getMin2(['a', 'b', 'c']));

1、泛型是啥?

泛型英文是 generics ,是指在定义函数、接口或类的时候,不预先指定具体的类型,而是在使用的时候再指定类型的一种。

定义方式:

function fnName<T>(arg:T,...):T{
 return ...
}

泛型变量通常用 T 来表示,T可以表示任何类型。

所以呢,我们可以将上述实例修改成以下代码:

function getMin<T>(arr: T[]): T{
 let min = arr[0]
 for (var i = 1; i < arr.length; i++){
  if (min > arr[i]) {
   min = arr[i]
  }
 }
 return min
}
getMin<number>([1, 2, 3, 4])
getMin<string>(['a', 'b', 'c', 'd'])

上述代码中,T 的主要作用就是帮助我们来捕获用户传入的类型,比如 :numberstring 。另外编译器也会根据传入的参数自动地帮助我们进行类型推断,然后把 T 设置为它的类型,所以可以忽略类型的传入,如:

getMin([1, 2, 3, 4])
getMin(['a', 'b', 'c', 'd'])

在一些复杂的情况下,为了防止编译器自动推断类似失败,尽可能地将类型传入,防止出错。

2、泛型类型

泛型函数的类型和非泛型函数的类型有什么不同?

它们看着很相似,泛型函数类型前面有一个类型参数 <T>。

对于泛型函数类型还有以下特性:

a>、泛型函数类型可以有多个参数

function fn<T, U>(arg1: T, arg2: U) {
 return arg1
}

b>、泛型函数可以使用不同的泛型参数名

function fn<T>(arg1: T) {
 return arg1
}
let Fn: <M>(arg1: M) => M = fn

c>、可以使用带有对象字面量的方式定义泛型函数

function fn<T>(arg1: T) {
 return arg1
}
let Fn: {<T>(arg: T): T} = fn

3、泛型接口

在使用对象字面量的方式定义泛型函数时,对象的形式可以替换成接口的形式,改为:

let Fn: { <T>(arg: T): T } = fn

//替换为

interface FnInter{
 <T>(arg: T): T
}
let Fn: FnInter = fn

这种方式存在问题:函数对数据类型一无所知,无法使用某个数据类型进行操作。所以需要改良下,将类型作为参数传入,如:

interface FnInter<T>{
 (arg:T): T
}
let Fn: FnInter<string> = fn

这样我们就能清楚地知道使用的具体是那个泛型类型。

我们将整个接口当做泛型参数,就叫做泛型接口。它的优点就是我们能清除知道参数的数据类型,接口内的成员也能知道参数的具体类型。

4、泛型类

除了有泛型接口之外,还有接口类。泛型类与泛型函数差不多。

语法格式为:

class 名称<T>{}
new 类名<类型>()
class GetMin<T>{
  arr: T[] = []
  add(ele:T) {
 this.arr.push(ele)
  }
  getMin(): T{
 var min = this.arr[0]
 for (var i = 0; i < this.arr.length; i++){
  if (min > this.arr[i]) {
   min = this.arr[i]
  }
 }
 return min
 }
}
let gMin1 = new GetMin<number>()
gMin1.add(1)
gMin1.add(5)
console.log(gMin1.getMin());//1

let gMin2 = new GetMin<string>()
gMin2.add('a')
gMin2.add('b')
console.log(gMin2.getMin());//2

5、泛型约束

泛型功能确实挺强大的,但它也不是万能的。比如:

function getLength<T>(val: T): number {
 return val.length;
}

错误信息提示:类型“T”上不存在属性“length”。

原因是只有字符串、数组才有 length 属性,对于数字、对象没有 length 属性,所以报错了。解决办法是要保证传入的数据类型有 length 属性,所以需要使用泛型约束。

泛型约束主要是通过接口 + extends 关键字来实现约束。

interface ILen{
 length:number
}
function getLength<T extends ILen>(val: T): number {
 return val.length;
}
console.log(getLength<string>("abcd"));
console.log(getLength<number>(1)); //错误提示:类型“number”不满足约束“ILen”。

使用泛型约束的优点是帮我们自动检测传入的值是否符合约束类型的值,不满足时就会有错误提示。

6、泛型参数默认类型

typescript 2.3 以后,可以为泛型中的类型参数指定默认类型,当使用泛型时没有指定参数类型,并且编辑器从实际参数中也无法推断出数据类型时,就使用默认类型。

使用简单:

interface P<T = string>{
 name:T
}
let p1: P = { name: "小姐姐" }
let p2: P<number> = { name: 18 }

​泛型参数的默认类型遵循以下规则:​

  • 有默认类型的类型参数被认为是可选的。
  • 必选的类型参数不能在可选的类型参数后。
  • 如果类型参数有约束,类型参数的默认类型必须满足这个约束。
  • 当指定类型实参时,你只需要指定必选类型参数的类型实参。 未指定的类型参数会被解析为它们的默认类型。
  • 如果指定了默认类型,且类型推断无法选择一个候选类型,那么将使用默认类型作为推断结果。
  • 一个被现有类或接口合并的类或者接口的声明可以为现有类型参数引入默认类型。
  • 一个被现有类或接口合并的类或者接口的声明可以引入新的类型参数,只要它指定了默认类型。

7、泛型条件类型

在 typeScript 2.8 中,引入了条件类型,我们可以根据某些条件得到不同的类型,此处的条件是类型兼容性约束。ript 2.8 中,引入了条件类型,我们可以根据某些条件得到不同的类型,此处的条件是类型兼容性约束。

条件类型会以一定条件表达式进行类型关系检测,从而在两种类型中选择其一:

使用语法:

T extends U ? X : Y

​以上表达式的意思是:若 ​T​ 能够赋值给 ​U​,那么类型是 ​X​,否则为 ​Y​。

到此这篇关于typeScript 泛型使用和泛型接口结合的文章就介绍到这了,更多相关typeScript 泛型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: typeScript 泛型使用和泛型接口结合

本文链接: https://www.lsjlt.com/news/140085.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • typeScript 泛型使用和泛型接口结合
    目录1、泛型是啥?2、泛型类型3、泛型接口4、泛型类5、泛型约束6、泛型参数默认类型7、泛型条件类型typeScript 中新增的泛型概念、泛型使用、泛型与接口结合: 在实际应用中...
    99+
    2022-11-13
  • typeScript泛型使用和泛型接口结合的方法
    这篇“typeScript泛型使用和泛型接口结合的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“typeScript泛型...
    99+
    2023-06-29
  • TypeScript中的接口和泛型是什么
    这篇文章给大家分享的是有关TypeScript中的接口和泛型是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。接口使用 interface 关键字来定义数据类型对象类型当存在于较长的数据类型约束时,我们可以通过...
    99+
    2023-06-29
  • TypeScript接口与泛型全面精讲
    目录一、接口1. Interface 接口类型(1) 接口类型的基本使用(2) 可缺省属性(3) 只读属性(4) 定义函数类型(5) 索引签名2. Type 类型别名3. one q...
    99+
    2022-11-13
    TypeScript接口与泛型 TypeScript接口 TypeScript泛型
  • TypeScript中的接口和泛型你了解吗
    目录接口对象类型索引类型函数类型继承交叉类型接口实现interface 和 type 的区别字面量赋值枚举类型泛型泛型函数泛型接口泛型类类型约束总结接口 使用 interface 关...
    99+
    2022-11-13
  • TypeScript泛型的使用
    目录1.简单的使用 2.在函数中使用泛型 3.在类中使用泛型 4.在泛型约束中使用类型参数 前言: 在JavaScript中,封装一个API可以具有多种用途,因为其实弱类型语言,但...
    99+
    2022-11-12
  • TypeScript泛型使用详细介绍
    目录1 什么是泛型2 泛型方法3 泛型类4 泛型接口1 什么是泛型 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别...
    99+
    2022-11-13
    TypeScript泛型 TypeScript泛型使用方法
  • TypeScript泛型的使用详细介绍
    目录情景再现使用泛型泛型类型泛型接口泛型类泛型约束在泛型里使用类类型[]高级案例情景再现 这里针对一种情况,也是非常常见的一种情况:那就是 function identity(arg...
    99+
    2022-11-13
  • 在 TypeScript 中使用泛型的方法
    目录1. 泛型语法2. 在函数中使用泛型(1)分配泛型参数(2)直接传递类型参数(3)默认类型参数(4)类型参数约束3. 在接口、类和类型中使用泛型(1)接口和类中的泛型(2)自定义...
    99+
    2022-11-13
  • C#泛型接口实例应用
    这篇文章主要讲解了“C#泛型接口实例应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#泛型接口实例应用”吧!C# 泛型接口代码//Type parameter T&n...
    99+
    2023-06-17
  • 怎么在java中使用泛型接口
    怎么在java中使用泛型接口?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实...
    99+
    2023-06-14
  • TypeScript中泛型的使用详细讲解
    目录一、泛型程序设计是一种编程风格或编程范式二、案例:传入的参数类型与返回的类型一样三、形式类型参数四、泛型约束五、泛型函数六、泛型函数类型推断补充:应用场景总结一、泛型程序设计是一...
    99+
    2022-11-13
    typescript泛型使用 ts 泛型
  • AJPFX总结泛型概念和使用
    泛型泛型(generic)概述和基本使用                泛型把明确数据类型的操作放到创建对象或者调用方法的时候再明确。   ...
    99+
    2023-06-02
  • C#程序中怎么使用泛型集合代替非泛型集合
    C#程序中怎么使用泛型集合代替非泛型集合,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。软件开发过程中,不可避免会用到集合,C#中的集合表现为数...
    99+
    2022-10-18
  • C#泛型接口的协变和逆变
    1、什么是协变、逆变? 假设:TSub是TParent的子类。协变:如果一个泛型接口IFoo<T>,IFoo<TSub>可以转换为IFoo<TParen...
    99+
    2022-11-13
  • TypeScript 泛型重载函数的使用方式
    目录前言TypeScript 的运行环境1. ts-node2. tscTypeScript 中的函数重载简单的排序算法1. 快速排序2. 中文排序3. 字符串自排序4. 通过泛型整...
    99+
    2022-11-13
    TypeScript 泛型重载函数使用方式 TypeScript 泛型重载函数
  • TypeScript接口和类型的区别小结
    目录接口(interface)类型(type)interface vs type结论TypeScript 是由 Microsoft 开发的一种开源的编程语言。它是 JavaScrip...
    99+
    2023-05-20
    TypeScript接口和类型区别 TypeScript 接口 类型
  • C# 泛型集合类List<T>使用总结
    目录为什么选择使用List,而不是使用Array,或者ArryList去重、交集、并集、差集操作重写Equals() 和 GetHashCode()简单使用C#中List可谓是使用最...
    99+
    2022-11-13
  • Go泛型实战教程之如何在结构体中使用泛型
    目录01 目标02 实现01 目标 假设我们要实现一个blog系统,在该系统中有以下两个结构体: type Category struct { ID int32 Na...
    99+
    2022-11-11
  • C#中各种泛型集合的使用方法总结
    本篇体验除Queue<T>和Stack<T>之外的其它泛型集合。 SortedList<TKey, TValue> SortedList<T...
    99+
    2022-11-13
    C# 泛型集合
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作