首页 > 其他分享 >TypeScript学习笔记之泛型

TypeScript学习笔记之泛型

时间:2024-03-25 23:02:09浏览次数:40  
标签:function TypeScript return 泛型 使用 笔记 类型 arg 之泛

介绍

软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。

在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。

泛型之Hello World

下面来创建第一个使用泛型的例子:identity函数。 这个函数会返回任何传入它的值。 你可以把这个函数当成是 echo命令。

不用泛型的话,这个函数可能是下面这样:

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

或者,我们使用any类型来定义函数:

function identity(arg: any): any {
    return arg;
}

使用any类型会导致这个函数可以接收任何类型的arg参数,这样就丢失了一些信息:传入的类型与返回的类型应该是相同的。如果我们传入一个数字,我们只知道任何类型的值都有可能被返回。

因此,我们需要一种方法使返回值的类型与传入参数的类型是相同的。 这里,我们使用了 类型变量,它是一种特殊的变量,只用于表示类型而不是值。

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

我们给identity添加了类型变量T。 T帮助我们捕获用户传入的类型(比如:number),之后我们就可以使用这个类型。 之后我们再次使用了 T当做返回值类型。现在我们可以知道参数类型与返回值类型是相同的了。 这允许我们跟踪函数里使用的类型的信息。

我们把这个版本的identity函数叫做泛型,因为它可以适用于多个类型。 不同于使用 any,它不会丢失信息,像第一个例子那像保持准确性,传入数值类型并返回数值类型。

我们定义了泛型函数后,可以用两种方法使用。 第一种是,传入所有的参数,包含类型参数:

let output = identity<string>("myString");  // type of output will be 'string'

这里我们明确的指定了T是string类型,并做为一个参数传给函数,使用了<>括起来而不是()。

我们也可以使用不同的泛型参数名,只要在数量上和使用方式上能对应上就可以。

function add<T, U>(a: T, b: U): Array<T | U> {
  return [a, b];
}
add<number, string>(1, '1');

定义泛型接口

声明接口的时候 在名字后面加一个<参数>

使用的时候传递类型

interface A<T> {
  (arg: T): T;
}
const f: A<number> = (a: number) => {
  return a;
}

对象字面量泛型

let f = function <T>(a: T, b: T): Array<T> {
  return [a, b]
}
f<number>(1, 2)

泛型约束

我们期望在一个泛型的变量上面,获取其length参数,但是,有的数据类型是没有length属性的

function getLegnth<T>(arg:T) {
  return arg.length
}

arg如果不是数组类型就没有length属性

这时候我们就可以使用泛型约束

于是,我们就得对使用的泛型进行约束,我们约束其为具有length属性的类型,这里我们会用到interface,代码如下

interface A{
  length:number
}

function getLegnth<T extends A>(arg:T) {
  return arg.length
}
getLegnth<string>('123')

使用keyof 约束对象

其中使用了TS泛型和泛型约束。首先定义了T类型,并使用extends关键字继承object类型的子类型,然后使用keyof操作符获取T类型的所有键,它的返回类型是联合类型,最后利用extends关键字约束K类型,必须为keyof T联合类型的子类型

let obj = {
  name: 'zl',
  age: 18
}
type keys = keyof typeof obj; // keys为联合类型的别名keys = 'name' | 'age'

function f<T extends object, K extends keyof T>(obj: T, key: K) {
  return obj[key]
}
console.log(f(obj, 'name')); //zl

泛型类

声明方法跟函数类似,名称后面定义<类型>

使用的时候确定类型new A<number>()

class A<T>{
  arr:T[]=[];
  add(a:T,b:T):T[]{
    return [a,b];
  }
}
let s=new A<number>();
console.log(s.add(1,2));
s.arr=[1,2,3]
console.log(s.arr);

标签:function,TypeScript,return,泛型,使用,笔记,类型,arg,之泛
From: https://blog.csdn.net/qq_39237831/article/details/137028443

相关文章

  • 【笔记】普通生成函数
    【笔记】普通生成函数0前置芝士0.1等比数列因为我不会,所以在这里提一嘴。\(a_i=a_{i-1}q\Rightarrowa_i=a_1q^{i-1}\)\(S=\sum\limits_{i=1}^na_i\RightarrowqS=\sum\limits_{i=2}^{n+1}a_i=S-a_{n+1}+a_1\)\(\RightarrowS=\dfrac{a_1(q^n-1)}{q-1}\)​0.2泰勒级......
  • 2017 各省省选做题笔记
    AHOI/HNOID1T1单旋不会哦,感觉这题最难。D1T2影魔考虑计算每个位置作为\([l+1,r-1]\)中的最大值时的贡献,一定是有一端取到了左边第一个比自己大的或者右边第一个比自己大的,可以用单调栈求出所有的有效点对,是线性的,然后做一遍二维数点即可。D1T3礼物首先考虑不做修......
  • set集合 and 字典 笔记
    set()集合S={1,"你好",2,3}print(type(s))print(s)不可哈希:python中的set集合进行数据存储的时候。需要对数据进行哈希计算,根据计算出的哈希值进行数据存储set集合要求存储必须是可以进行哈希计算的可哈希:不可变的数据类型,int,str,tuple,bool不可哈希:可变的数据类型,kli......
  • 高维前缀和/SOS DP 学习笔记
    JOISC2023D2T2Council注意到,钦定一个人为主席后,对于此时得票数大于\(\lfloor\frac{n}{2}\rfloor\)的议案,不管怎么选副主席,均能通过;对于此时得票数小于\(\lfloor\frac{n}{2}\rfloor\)的议案,不管怎么选副主席,均不能通过。所以需要考虑的只有此时得票数恰好等于\(\lfloo......
  • 刷题笔记 3.25
    ABC254C题:给定一个长为n的数列,给定k,可以进行的操作是:交换a[i]和a[i+k],可以进行任意多次,问能否sort成一个非递减数列?我当时的思路:因为我们是知道最后的数列的样子的,然后就思考:“这个数怎么变过来?可以变吗?”然后就发现好像只需要最后的非递减数列的每一个数在原数列中的对应下标......
  • 牛客周赛 Round 38做题笔记
    一.题目链接登录—专业IT笔试面试备考平台_牛客网牛客网是互联网求职神器,C++、Java、前端、产品、运营技能学习/备考/求职题库,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://ac.nowcoder.com/acm/contest/78......
  • 学习笔记之算法快速排序
    快速排序听说有的公司面试会考?0.0快速排序思想:分治法基本思想:1、从数列中选出一个数2、分区(遍历),比它大的放他右边,比它小的或者等于的,放他左边3、对左右区间重复第2步,直到区间只有一个数(递归)参考:快速排序|菜鸟教程(runoob.com)在该网站......
  • Vue学习笔记59--store(getters + )
    store(getters) 示例一:Count.vue<template><div><h3>当前求和为:{{$store.state.sum}}</h3><h3>当前求和*10为:{{$store.getters.bigSum}}</h3><!--<selectv-model="selectNo"><option:va......
  • 学习笔记-d2l
    2.1TensorFlow中的Tensors是不可变的,也不能被赋值。TensorFlow中的Variables是支持赋值的可变容器。请记住,TensorFlow中的梯度不会通过Variable反向传播。如果我们用Y=X+Y,我们将取消引用Y指向的张量,而是指向新分配的内存处的张量。assign将一个操作的结果分配给一个Var......
  • Vue学习笔记58--vuex
    vuex专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对Vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。Github地址:https://github.com/vuejs/vuex什么时候使用Vuex多个组件依赖于同一状态来自不同组件的行为需要......