11. Typescript 泛型

1. 概述

泛型,在 TS 中是很重要的东西,例如 Vue3,其中用到非常多的泛型。它是一种将类型参数化的机制,可以在类、方法、接口中使用,允许在创建对象或调用方法时才明确特定类型。

通俗来讲,它就是用一个特殊符号代表了类型注解,当我们定义变量时,使用该特殊符号代替类型。在使用是再将类型传入。这样就可以使方法接口等等变得更加灵活。也就是动态类型。

2. 定义泛型

2.1. 普通定义

在下面的例子里,我们使用字母 T 来做泛型参数名,在使用时再将固定类型传入,这样的好处就是 同样一个方法,value 可以通过我们传入类型的同,传入不同类型的参数,更加灵活。

css 复制代码
// 泛型
function createArray<T>(length: number, value: T): Array<T> {
    let result: T[] = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}
createArray<string>(3, 'x'); // ['x', 'x', 'x']

2.2. 多个参数类型泛型

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

arduino 复制代码
// 多个类型参数
function swap<T, U>(tuple: [T, U]): [U, T] {
    return [tuple[1], tuple[0]];
}
swap([7, 'seven']); // ['seven', 7]

2.3. 泛型接口

声明接口也可以使用泛型,在声明接口时,在名字后面加一个 <参数> ,在使用的时候传递类型

r 复制代码
// 泛型接口
interface CreateArrayFunc {
    <T>(length: number, value: T): Array<T>;
}
let createArray1: CreateArrayFunc;
createArray1 = function<T>(length: number, value: T): Array<T> {
    let result: T[] = [];
}

2.4. 泛型类

ini 复制代码
// 泛型类
class GenericNumber<T> {
  zeroValue: T;
  add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

3. 泛型约束

当我们希望在一个泛型上做一些操作,比如获取 length 参数,然而,有些类型是不支持这些操作的。例如数字类型没有 length 属性,这个时候我们就可以使用泛型约束。约束其为具有 length 属性的类型。

需要使用 interface 接口。

typescript 复制代码
// 泛型约束
interface Lengthwise {
    length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length);  // Now we know it has a .length property, so no more error
    return arg;
}

4. 代码下载

📎泛型.ts

相关推荐
badhope3382 小时前
当所有AI都在抄同一份作业:前端模板的趋同、困局与破局
前端·ai·ai编程·前端开发·tailwind·ui设计
光影少年2 小时前
RN的Fabric 渲染流程
运维·前端·javascript·react native·react.js·fabric
__zRainy__3 小时前
React开始:直接在网站中使用React.js
前端·react.js·前端框架
用户059540174464 小时前
大模型长记忆评测踩坑实录:2000条错位记忆,让我排查了整整3小时
前端·css
码林鼠4 小时前
webpack的基本配置
前端·webpack·node.js
用户938515635074 小时前
React Router 进阶:路由守卫、登录鉴权与状态传递
前端·javascript·全栈
kyriewen4 小时前
我重写了自己用了两年的防抖节流Hook——发现里面藏着3个隐藏bug
前端·javascript·面试
阿祖zu5 小时前
芝士就是力量!开源私有化部署与 GitHub 双向同步的个人知识笔记 App
前端·后端·ios
漂流瓶jz5 小时前
Webpack开发环境:观察模式/webpack-dev-server/HMR热更新
前端·javascript·webpack
IT_陈寒5 小时前
SpringBoot自动配置失效?这个隐藏配置坑了我一整晚
前端·人工智能·后端