TypeScript(ts)泛型说明及基本使用

泛型是什么?

泛型是 TypeScript比较高级的功能之一,
泛型应用场景非常广泛,平时我们阅读开源 TS 项目源码,或者在自己的 TS 项目中使用一些第三方库(比如 React)的时候,经常会看到各种泛型定义。

泛型允许我们在定义的时候不具体指定类型,而是泛泛地说一种类型,并在函数调用的时候再指定具体的参数类型。
也就是说泛型也是一种类型,只不过不同于 string, number 等具体的类型,它是一种抽象的类型,我们不能直接定义一个变量类型为泛型。

为什么使用泛型?

假如我们要实现一个函数fn,函数的参数可以是任何值,返回值就是将参数原样返回,并且其只能接受一个参数,应该怎么做?

一般在可能顺手写出来一行代码:

const fn = (arg) => arg;

接下来我们给它加上类型声明:

type fnBoolean = (arg: boolean) => boolean;
type fnNumber = (arg: number) => number;
type fnString = (arg: string) => string;

虽然看着简单,但是js提供多少类型就写多少,然后声明类型,这样代码的出错率会提高,而且代码难以维护,牵一发而动全身。并且将来 JS 新增新的类型,仍然需要修改代码,很麻烦。
有一种解决方法是使用any类型这种“万能语法”,但是使用any后虽然怎么写都行,但是这样也就失去了ts类型检查的意义。
因此,,我们使用泛型对上面的代码进行重构。和我们的定义不同,这里用了一个 类型 T,这个T 是一个抽象类型,只有在调用的时候才确定它的值。

function fn<T>(arg: T): T {
  return arg;
}

泛型的基本使用

在函数中使用

function fn<T> (arg:T):T{
  return arg;
}
fn<number>(666);// 返回值是number类型 666
fn<string>('黄雨萌')//返回值是string类型 黄雨萌
fn<boolean>(true);//返回值是布尔类型 true

就是刚才提到的,需要什么类型就可以给什么类型,类似于函数的传参。

fn(666)
fn('黄雨萌')
fn(true)

编译器会自动识别传入的参数,将传入的参数的类型认为是泛型指定的类型,效果是一样的

在接口中使用

interface person {
    <T, Y>(name: T, age: Y): T
}
let people:person = function(name,age){
    return name
}
people("黄雨萌", 18)

在类中使用

class Friends<T, Y> {
    name: T
    age: Y
    constructor(name:T, age:Y) {
        this.name = name
        this.age = age
    }
}
let wife = new Friends("黄雨萌", 18) // 实例对象 Friends{name: '黄雨萌', age: 18}

泛型约束

使用接口约束泛型

interface Person {
    name: string,
    age: number
}

function girl<T extends Person>(obj: T): T {
    return obj
}
girl({ name: "黄雨萌" }) // 类型“{ name: string; }”的参数不能赋给类型“Person”的参数 类型 "{ name: string; }" 中缺少属性 "age",但类型 "Person" 中需要该属性
girl({ name: "黄雨萌", age: "18" }) // 不能将类型“string”分配给类型“number”
girl({ name: "黄雨萌", age: 18 })

数组泛型

let arr11: Array<number> = [1, 2, 3]
let arr22: number[] = [1, 2, 3]

两种写法是一样的效果

泛型工具类型

未完待续

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Ts 泛型在函数中的使用举例:比如我们有一个函数,它可以接收任意类型的参数,但是我们又希望在函数内部对这些参数进行一些操作,那么我们就可以使用泛型来实现这个功能。例如: function identity<T>(arg: T): T { return arg; } 这个函数接收一个泛型参数 T,它可以是任意类型。在函数内部,我们直接返回这个参数,这样就可以实现对任意类型的参数进行操作了。 ### 回答2: TypeScript (TS) 是一种静态类型语言,它引入了泛型概念,用于在函数中进行通用类型的处理。下面是一个使用泛型的函数示例: ```typescript function reverseArray<T>(arr: T[]): T[] { return arr.reverse(); } const numbers = [1, 2, 3, 4, 5]; const reversedNumbers = reverseArray(numbers); console.log(reversedNumbers); // [5, 4, 3, 2, 1] const strings = ['Hello', 'World']; const reversedStrings = reverseArray(strings); console.log(reversedStrings); // ['World', 'Hello'] ``` 上述示例中,函数 `reverseArray` 使用泛型 `<T>`,表示该函数可以接受通用类型 `T` 的数组作为参数,并返回相同类型的数组。在函数体内,首先调用了数组的 `reverse` 方法,然后将结果返回。 在代码中调用 `reverseArray` 函数时,可以传入不同类型的数组参数。比如,`numbers` 是一个整数数组,`strings` 是一个字符串数组。通过使用泛型,我们可以方便地处理这些不同类型的数组,并获得相应的结果。 在编译阶段,TypeScript 会根据实际传入的参数类型进行类型推导,确保传入的参数类型和返回值类型一致,从而提供编译时的类型检查。这样可以避免传入错误类型的参数导致运行时错误的问题。 总之,通过使用泛型,我们可以在函数中编写通用的代码,以适应不同类型的数据,并且在编译阶段进行类型检查,提高代码的可靠性和可维护性。 ### 回答3: 泛型在函数中的使用可以提供更加灵活和通用的编程方式,以下是一个关于泛型在函数中的使用举例: 举例我们有一个函数 `findMax`,用于找到数组中的最大值。如果我们只是针对具体的数值类型进行编写,那么函数的重用性会受到限制。但是通过使用泛型,我们可以编写一个能够适用于不同类型的数组的函数。 ```java public static <T extends Comparable<T>> T findMax(T[] array) { T max = array[0]; for (int i = 1; i < array.length; i++) { if (array[i].compareTo(max) > 0) { max = array[i]; } } return max; } ``` 在这个例子中,使用了 `<T extends Comparable<T>>` 这样的语法来声明泛型 `T`,并限制了 `T` 的类型必须是实现了 `Comparable` 接口的类型,这样我们就可以使用 `compareTo` 方法来比较不同类型的对象。 通过使用泛型,我们可以在调用这个函数时传入不同类型的数组,例如 `Integer[]`、`Double[]` 或者自定义的类数组,而不需要针对每种类型编写不同的函数。 ```java Integer[] integers = {1, 2, 3, 4, 5}; Double[] doubles = {1.5, 2.3, 0.9, 4.7}; String[] strings = {"apple", "banana", "orange"}; System.out.println(findMax(integers)); // 输出:5 System.out.println(findMax(doubles)); // 输出:4.7 System.out.println(findMax(strings)); // 输出:orange ``` 通过这个例子,我们可以看到泛型在函数中的使用,使得我们能够更加灵活地处理不同类型的数据,提高了代码的可重用性和通用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宫商羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值