TS复习-------TS中的泛型

2023-11-06

目录

概念

初识泛型

泛型类型

泛型类

泛型约束

泛型工具类型

Partial

 Record

ReturnType

Pick

 Exclude


概念

泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。

当我们定义一个变量不确定类型的时候有两种解决方式:

  • 使用any
    使用any定义时存在的问题:虽然 以 知道传入值的类型但是无法获取函数返回值的类型;另外也失去了ts类型保护的优势
  • 使用泛型
    泛型指的是在定义函数/接口/类型时,不预先指定具体的类型,而是在使用的时候在指定类型限制的一种特性。

初识泛型

定义泛型:我们把要传入函数的参数类型设为一个类型变量 T ,它能够帮助我们捕获用户传入的类型,之后出现 T 的地方,都会被替换成用户传入的类型。

  • 可以用两种方法使用。 第一种是,传入所有的参数,包含类型参数:
  • 利用了类型推论 -- 即编译器会根据传入的参数自动地帮助我们确定T的类型:

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

function getFirst<T>(arr: T[]): T {
    return arr[0];
}

console.log(identity<number>(10)); // 10
console.log(identity<string>('TS')); // TS
console.log(getFirst([1, 2, 3, 4])); // 1
console.log(getFirst(['a', 'b', 'c'])); // a

 其实并不是只能定义一个类型变量,我们可以引入希望定义的任何数量的类型变量。比如我们引入一个新的类型变量 U,用于扩展我们定义的 identity 函数:

function identity <T, U>(value: T, message: U) : T {
  console.log(message);
  return value;
}

console.log(identity<Number, string>(68, "Semlinker"));

 

泛型类型

<泛型变量名称>(参数1: 泛型变量, 参数2: 泛型变量, ...参数n: 泛型变量) => 泛型变量

 我们还可以使用带有调用签名的对象字面量来定义泛型函数:

let foo: { <T>(arg: T): void };
foo = function <T>(arg: T): void {
    console.log(arg);
}
foo(13); // 13

泛型接口



    interface CreateArrayFunc<T> {
        (length: number, value: T): Array<T>;
    }

    let createArray: CreateArrayFunc<any>;
    createArray = function <T>(length: number, value: T): Array<T> {
        let result: T[] = [];
        for (let i = 0; i < length; i++) {
            result[i] = value;
        }
        return result;
    }

    createArray(3, 'x'); // ['x', 'x', 'x']

泛型类

泛型类看上去与泛型接口差不多。 泛型类使用( <>)括起泛型类型,跟在类名后面。

类有两部分:静态部分和实例部分。 泛型类指的是实例部分的类型,所以类的静态属性不能使用这个泛型类型。

class Animal<T> {
    name: T;
    constructor(name: T) {
        this.name = name;
    }
    action<T>(say: T) {
        console.log(say)
    }
}
let cat = new Animal('cat');
cat.action('mimi')

泛型约束

我们定义一个接口来描述约束条件。 泛型可以通过 extends 一个接口来实现泛型约束,写法如:<泛型变量 extends 接口> ,

interface Person {
    name: string;
    age: number;
}
function student<T extends Person>(arg: T): T {
    return arg;
}

student({ name: 'lili' });//类型 "{ name: string; }" 中缺少属性 "age",但类型 "Person" 中需要该属性
student({ name: "lili", age: '11' });//不能将类型“string”分配给类型“number”
student({ name: "lili", age: 11 });

泛型工具类型

Partial

Partial<T> 的作用就是将某个类型里的属性全部变为可选项 ?

interface Person {
    name: string;
    age: number;
}
function student<T extends Person>(arg: Partial<T>): Partial<T> {
    return arg;
}

student({
    name: 'zs'
})

 Record

Record<K extends keyof any, T> 的作用是将 K 中所有的属性的值转化为 T 类型。


interface PageInfo {
    title: string
}
type Page = 'home' | 'about' | 'other';
const x: Record<Page, PageInfo> = {
    home: { title: "xxx" },
    about: { title: "aaa" },
    other: { title: "ccc" },
};

ReturnType

ReturnType<T> 的作用是用于获取函数 T 的返回类型。

type T0 = ReturnType<() => string>; // string
type T1 = ReturnType<(s: string) => void>; // void
type T2 = ReturnType<<T>() => T>; // {}
type T3 = ReturnType<<T extends U, U extends number[]>() => T>; // number[]
type T4 = ReturnType<any>; // any
type T5 = ReturnType<never>; // any
type T6 = ReturnType<string>; // Error
type T7 = ReturnType<Function>; // Error

Pick

Pick<T, K extends keyof T>的作用是将某个类型中的子属性挑出来,变成包含这个类型部分属性的子类型,示例:

interface Todo {
  title:string,
  desc:string,
  time:string
}
type TodoPreview = Pick<Todo, 'title'|'time'>;
const todo: TodoPreview ={
  title:'吃饭',
  time:'明天'
}

 Exclude

Exclude<T,U>的作用是将某个类型中属于另一个类型的属性移除掉,示例:

type T0 = Exclude<"a" | "b" | "c", "a">; // "b" | "c"
const t: T0 = 'a'; //不能将类型“"a"”分配给类型“T0”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TS复习-------TS中的泛型 的相关文章

  • 可能未处理的承诺拒绝(id 0)类型错误 GET 或 HEAD 请求不允许主体

    import React from react import FlatList ActivityIndicator Text View from react native export default class FetchExample
  • Jquery 悬停卡

    我在用着http designwithpc com Plugins Hovercard http designwithpc com Plugins Hovercard 但我不知道如何在悬停卡上声明 var 每个工作描述都有自己的 ID 当悬
  • 在特定页面上执行 javascript 的正确“Rails”方式

    我试图在特定页面上运行 javascript 而我唯一的解决方案似乎是反模式 我有controller js内部生成的assets javascripts 我在用着gem jquery turbolinks 我的代码类似于以下内容 docu
  • 位置特征检测:固定

    我正在尝试找到一个脚本来检测设备是否放置position fixed元素相对于视口而不是整个文档 目前 标准桌面浏览器和 Mobile Safari 适用于 iOS 5 都是这样做的 而 Android 设备则相对于整个文档放置固定元素 我
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • Angular.js:如何从无序列表中获取 orderBy 或过滤器来工作?

    尝试根据价格和评级 在返回的对象中 进行排序 我宁愿用 ng click 和 li 来代替使用选择菜单 有没有办法做到这一点 我环顾四周 这是我能想到的最接近的 ul class restaurant filter li i class i
  • 为什么 window 与 Internet Explorer 中的 window.self 不同?

    关于我如何遇到这个问题有一个复杂的背景故事 但为什么self属性不完全等于窗口本身 在 Safari 和 Firefox 及其朋友中 结果如我所料 gt window window self true gt window window se
  • 通过 JavaScript 获取表单名称

    我有一个简单的问题 但我在网上找不到好的解决方案 我有这个 HTML 代码
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • onclick 事件中未调用函数

    我想在每个 YouTube 链接的末尾添加一些 HTML 以在 litebox 中打开播放器 到目前为止 这是我的代码 document ready function var valid url new RegExp youtube com
  • mongodb 聚合 - 累积字段的不同组值

    如果我有Player表格文件 name String score Int 我有Group文档 其中组代表玩家列表 groupName String players ObjectID 玩家可以属于多个组 我想做一个聚合Player文档 按以下
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • LeafleteachLayer函数不会迭代所有Layer

    使用 GeoJSON 数据数组创建一些标记 getJSON GetLocationsServlet function data L geoJSON data onEachFeature onEachFeature addTo mymap G
  • JavaScript eval("{}") 返回行为?

    根据ECMA 262 规范 http www ecma international org publications files ECMA ST Ecma 262 pdf 以下语句返回1 eval 1 eval 1 eval 1 var a
  • 使用javascript动态更新css内容

    需要将 css 更新为动态值 我不确定最好的方法是什么 div style zoom 1 div 缩放级别将根据窗口大小调整触发 应用程序将相应缩放 我将此应用程序加载到 cordova 中并让它在 iPAD 中运行 然后我意识到需要使用
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht
  • $resource.query 返回分割字符串(字符数组)而不是字符串

    我正在使用像下面这样的 Angular resource angular module app factory data function resource var Con resource api data update method P
  • Highcharts jQuery 渲染问题 - 所有浏览器

    我在尝试使用构建堆积柱形图时遇到了一个奇怪的问题高图表 http www highcharts com 当图表呈现时 在您调整浏览器大小之前 不会显示列无论如何 导致图表重绘 我认为 图表的其余部分显示 轴 标题等 但不显示列本身 我在 I
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容

随机推荐

  • 将数组s1中的字符串复制到数组s2中

    include stdio h include string h define N 81 void Strcopy char s2 char s1 int i j i 0 j 0 while s2 j s1 i int main void
  • 七夕王者荣耀服务器维护,七夕王者荣耀有什么福利 本文告诉你

    1 干将莫邪 久胜战神 冬季冠军杯FMVP Hero 久诚定制传说级皮肤 购买即送专属头像框 2 干将莫邪 久胜战神上架 首周折扣时间 8月6日更新后 8月12日23 59 首周折扣价格 1350点券 原价1688点券 拥有久胜战神专属抵扣
  • (四)TensorRT

    1 TensorRT 的简介和安装 TensorRT 是一种基于英伟达硬件的高性能的深度学习前向推理框架 本文介绍使用 TensorRT 在通用 GPU 上的部署流程 本地需先安装 CUDA 以 CUDA11 0 TensorRT 8 2
  • react chrome扩展包安装

    作用 可以检视 React 组件的树形结构 下载地址 https www crx4chrome com down 62541 crx 会下载一个名为fmkadmapgofadopljbjfkapdkoienihi 2 5 1 Crx4Chr
  • macvim语法高亮

    1 将vim的环境文件copy到自己常用用户的主目录下比如你的用户叫aitracy cp usr share vim vimrc aitracy vimrc 2 修改 vimrc文件归读写属性 sudo chmod 777 vimrc 3
  • Java实现微信运动步数(已自测)

    点赞再看 养成习惯 全网无BUG的Java实现微信运动步数 目录 开场白 一 下载App 二 导入依赖 三 运行main方法 四 查看步数 总结 开场白 我的室友金莲是一个貌美如花的大美女 在某月黑风高的夜晚 金莲突然看到自己的步数才56步
  • DOS下的winrar批处理解压命令合集大全!

    C Program Files WinRAR gt rar RAR 3 40 版权 C 1993 2004 Alexander Roshal 8 九月 2004 已注册给 Virtual 用法 rar lt 命令 gt lt 开关 1 gt
  • 简单的光线追踪--GPU高性能编程CUDA实战第六章

    光线跟踪Ray Traceing是本章的一个例子 用来讲什么是常量内存 Constant memory 之前的实验给分配的内存都是在全局内存里 线程读取数据的时候是每个线程分别进行一次读取操作 也就是说运行时间都用在了读取上 这就大大的降低
  • 人人学 Python,为什么拿高薪的那么少?

    Python语言相关的岗位非常多 有运维 有自动化测试 有后端开发 有机器学习 人工智能 python无所不能 市场上需要的Python人员非常多 而且按照现在的势头 以后会需要更多的Python开发人员 理由是以后每个人公司都会有自己的网
  • 机器学习20:基于ResNet50和FaceNet实现人脸识别

    说明 这是优达学城的一个机器学习作业项目 我觉得还比较典型综合了几个常见的深度学习技术 值得分享一下 实现包括 数据增广 迁移学习 网络模型构建 训练 评估方法等 这里只是做了一个迁移学习的实现 重在实践过程 其原理没做分析 缺点 由于训练
  • AI赋能:华院计算智能焦化方案入选2023通用人工智能创新应用案例

    目前 十四五 国家信息化规划 已提出了 构建产业数字化转型发展体系 的重大任务 而企业数智化转型是其中不可缺少的一环 中国信通院高度关注企业数智化转型中遇到的痛点 启动了2023年通用人工智能创新应用案例征集 根据申报项目的产品能力 技术创
  • Cocos2d-X中的节点类CCNode

    有过iOS开发经验的人应该对UIView不陌生 在Cocos2d X中也有属于它的 UIIView CCNode 接下来我们在比较中了解2d X中的CCNode 节点类CCNode是Cocos2d X中的主要类 继承自CCObject UI
  • 阿里云、华为云、百度云等比较

    几个朋友的亲身经历 也期望国内毛蟹厂家可以捉的更加好 阿里云 功能 对LINUX支持很好 有基本的小区防火墙 5个快照管理 有自定义镜像管理 价格 最低700 配置 1U 512 可以退款吗 可以 使用情况 非常好 还有短信报警 很稳定 公
  • html实现旅游网站代码_HTML+CSS实现头部head和导航的制作--源代码

  • 单机诛仙3服务器正在维护,【运营版】诛仙3单机版天界一键MSSQL端修复大量BUG+视频教程+GM工具...

    游戏版本 诛仙3单机天界一键MSSQL端 经安全测试 以下修改均可用 1 增加物品销售NPC 周一仙 小环 河阳飞天 月老 轩辕祖师 清风 明月 交造化 元神任务 黑市商人 礼品兑换使者 河阳炼器师 有大量物品销售 2 修改SecureCR
  • yarn遇到的问题啦,This may cause things to work incorrectly. Make sure to use the same version for both

    yarn的时候出错 This may cause things to work incorrectly If you are using vue loader lt 10 0 or vueify re installing vue load
  • django下载csv文件笔记

    下载小的csv文件 这里将用一个生成小的CSV文件为例 来把生成CSV文件的技术要点讲到位 我们用Python内置的csv模块来处理csv文件 并且使用HttpResponse来将csv文件返回回去 示例代码如下 1 在templates目
  • LeetCode:189. 轮转数组(Java)

    方法1 跳序 轮转法 带标记 时间复杂度和空间复杂度均为O n 因为有些特殊情况 会陷入循环 比如这个例子 我不知道怎么处理这种情况 所以直接搞个标记数组falgs 来看看这个位置的数字是否被处理过 方法二来改进这个陷入循环的问题 clas
  • Redis使用hmset利用相同key存数据时不完全覆盖问题

    首先说一下这篇博文得目的 昨天在使用redis时用到了hmset hmset简单说下是reids同时将多个键值对设置到哈希表中 按照key唯一得规则 相同key值进行赋值时肯定会对value值进行覆盖 但hmset却有些不同之处 接下来我做
  • TS复习-------TS中的泛型

    目录 概念 初识泛型 泛型类型 泛型类 泛型约束 泛型工具类型 Partial Record ReturnType Pick Exclude 概念 泛型 Generics 是指在定义函数 接口或类的时候 不预先指定具体的类型 而在使用的时候