TypeScript中的泛型的使用讲解

一、泛型程序设计是一种编程风格或编程范式

二、案例:传入的参数类型与返回的类型一样

function identify<T>(arg: T): T {// 当前的T没有任何约束 它可以是任何类型
    return arg;
}

const foo = identify('foo'); // foo的类型是'foo'
const bar = identify('true'); // bar的类型是true

三、形式类型参数

 1、形式类型参数T的默认类型为boolean类型

<T = boolean>

2、必选类型参数、可选类型参数

(1)、必选类型参数:形式类型参数没有给默认类型 , 例如: <T>

(2)、可选类型参数:形式类型参数给默认类型 , 例如: <T = boolean>

(3)、形式类型参数列表中,必选类型参数不允许出现在可选类型参数之后

<T = boolean, U> // 错误
<T, U = boolean> // 正确

四、泛型约束

       在形式类型参数上允许定义一个约束条件,它能够限定类型参数实际类型的最大范围。我们将类型参数的约束条件称为泛型约束

interface point {
    x: number,
    y: string
}

function getPoint<T extends point>(args: T): T {
    return args
}

console.log(getPoint({x: 123, y: 456})); // 错误
console.log(getPoint({x: 123, y: '456'})); // 正确
//参数的前俩个必须有并且类型必须正确  否则错误

可以同时定义泛型约束和默认类型

<T extends number = 0 | 1>

形式类型参数不允许直接或间接地将其自身作为约束类型

<T extends T> // 错误
<T extends U, U extends T> // 错误

类型参数T没有声明泛型约束,那么类型参数T的基约束为空对象类型字面量“{}”。除了undefined类型和null类型外,其他任何类型都可以赋值给空对象类型字面量

<T> // 类型参数T的基数约为“{}”类型

五、泛型函数

1.简介:若一个函数的函数签名(形参)中带有类型参数,那么它是一个泛型函数 

2.f1函数两个参数的类型相同,函数返回值类型是数组,数组元素类型 == 参数类型。

function f1<T>(x: T, y: T): T[] {
    return [x, y]
}

const a = f1(123, 456)
const b = f1('123', '456')

3.f2函数两个参数的类型不同,返回值类型为对象类型。返回值对象类型中x属性的类型与参数x类型相同,y属性的类型与参数y类型相同

function f2<T, U>(x: T,  y: U): { x: T, y: U} {
    return { x, y }
}

const a = f2('123', 456)
const b = f2(123, '456')

4.f3函数接受两个参数,参数a为任意类型的数组;参数f是一个函数,该函数的参数类型与参数a的类型相同,并返回任意类型。f3函数的返回值类型为参数f返回值类型的数组。

(这个代码的粘贴的   我也懵逼)

function f3<T, U>(a: T[], f: (x: T) => U): U[] {
    return a.map(f);
}
 
// f3<number, boolean> 约束T为number类型  U为boolean类型
const a: boolean[] = f3<number, boolean>([1, 2, 3], n => !! n)

六、泛型函数类型推断

function f0<T>(x: T): T {
    return x
}

const a = f0(123) // 推断出类型为 123
const b = f0('123') // 推断出类型为 '123'

此例中编译器推断出的不是number string类型,而是字符串字面量类型123和“123”。因为TS原则,始终将字面量视为字面量类型,只在必要的时候才会将字面量类型放宽为某种基础类型,例如string类型。此例中,字符串字面量类型“123”是比string类型更加精确的类型。

类型参数只在函数签名中出现一次,则说明它与其他值没有关联,则不需要使用类型参数,直接声明实际类型即可。

几乎任何函数都可以声明为泛型函数。若泛型函数的类型参数不表示参数之间或参数与返回值之间的某种关系,那么使用泛型函数可能是一种反模式

// 没必要使用泛型
function f<T>(x: T): void {
    console.log(x)
}

// 直接限定就好了
function f(x: number): void {
    console.log(x)
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 《TypeScript手册》是一本关于TypeScript语言的详细指南,它提供了对TypeScript的全面介绍和深入讲解。该手册通过易于理解的方式解释了如何使用TypeScript编写高质量的JavaScript代码,并利用TypeScript的特性来提高代码的可读性、可维护性和可扩展性。 《TypeScript手册》包含了各种主题,包括TypeScript的基础语法、变量和类型声明、函数和类、模块化编程、泛型、装饰器等。每个主题都有详细的解释和示例代码,以帮助读者更好地理解和应用所学知识。 该手册还介绍了TypeScript的类型系统,它可以帮助开发者在编写代码时更好地捕捉潜在的错误,并提供了更好的智能代码补全和重构功能。通过合理地使用类型注解和类型推断,开发者可以更轻松地进行代码重构和维护,减少代码错误和调试时间。 此外,该手册还介绍了如何配置TypeScript编译器和使用构建工具来实现自动化构建和部署。它提供了一些常见的TypeScript工具和框架的使用示例,如React、Angular、Node.js等,帮助开发者更快速地上手这些流行的技术栈。 总之,《TypeScript手册》是一本非常有价值的学习资料,无论是初学者还是有一定经验的开发者,都可以从获益。通过学习和实践,开发者可以更好地理解TypeScript语言的特点和优势,并能够更高效地使用TypeScript来开发高质量的应用程序。 ### 回答2: 《TypeScript Handbook》(TypeScript 手册)是一本面向 TypeScript 编程语言的权威指南。该手册详细介绍了 TypeScript 的语法、特性和用法,旨在帮助开发者更好地理解和应用 TypeScript。 手册的内容主要分为以下几个部分: 1. 基础类型:介绍 TypeScript 的基本数据类型,如数字、字符串、布尔等,以及数组和元组等复合类型。同时还包括了联合类型、交叉类型、类型断言等重要概念。 2. 变量声明:详细说明了在 TypeScript 如何声明变量、常量和函数,并且介绍了变量作用域、闭包、箭头函数等相关知识。 3. 接口和类:深入讲解TypeScript 的接口和类的定义和使用方法,包括类的继承、实现接口、抽象类等高级特性。 4. 函数和泛型:介绍了函数的定义和调用方式,并且讲解TypeScript 泛型的概念及应用,提供了一些常见的泛型示例。 5. 类型推断和类型兼容性:探讨 TypeScript 的类型推断机制,以及类型兼容性规则,帮助开发者更好地理解编译器对类型的推导和检查。 6. 模块:讲解TypeScript 的模块化开发,详细介绍了模块的导入和导出、命名空间的使用等相关内容。 7. 高级类型:介绍了一些 TypeScript 的高级类型,包括交叉类型、联合类型、索引类型、映射类型等,帮助开发者灵活地处理复杂的数据结构。 除了以上内容,手册还附带有一些示例代码和实用的技巧,帮助开发者快速上手并提升编程技能。 总而言之,《TypeScript Handbook》是一本详尽而全面的 TypeScript 参考指南,无论是初学者还是有经验的开发者,都可以通过阅读本手册来更好地理解和应用 TypeScript,提升代码质量和开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值