typescript 类型体操 之 43-easy-exclude

[ TS 类型体操 ] 初体验之 Tuple to Object, Tuple to Union 与 Tuple to Nested Object 它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。 阅读详情

前言

在学习typescript的过程当中,有一个github库对其类型的学习特别有帮助,是一个有点类似于leetcode的刷题项目,能够在里面刷各种关于typescript类型的题目,本片文章带大家做其中简单难度的第六道题 43-easy-exclude

type-challenges/type-challenges: Collection of TypeScript type challenges with online judge (github.com)

43-easy-exclude

我们首先还是先通过题目的README来看一下题目的要求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5PTtPsLN-1655351348660)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8d274a3b9e5b43ebb999c6c72e789d0f~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]

type cases = [
  Expect<Equal<MyExclude<'a' | 'b' | 'c', 'a'>, Exclude<'a' | 'b' | 'c', 'a'>>>,
  Expect<Equal<MyExclude<'a' | 'b' | 'c', 'a' | 'b'>, Exclude<'a' | 'b' | 'c', 'a' | 'b'>>>,
  Expect<Equal<MyExclude<string | number | (() => void), Function>, Exclude<string | number | (() => void), Function>>>,
] 

结合题目给的README和测试case,我们就能够得出,题目是需要我们实现一个函数,功能和内置的 Exclude 相同,接收一个联合类型,从中剔除掉传入的第二个类型成员,返回一个新的类型,下面我们可以简单地看一下 Exclude 的作用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gDIaMU67-1655351348660)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ac7ffe8cc49b41b3a63bad43eee10942~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]

接下来我们就开始做题

利用js进行对比学习

首先我们还是先用js来模拟题目的要求。

我们用数组来进行模拟,新建一个 JSMyExclude 函数,这个函数传入两个数组,我们需要从第一个数组中剔除掉第二个数组的内容,并且返回剔除后的新数组。

// js
function JSMyExclude(T, U) {
  let newArr = [];
  T.forEach((e) => {
    if (!U.includes(e)) {
      newArr.push(e);
    }
  });
  return newArr;
} 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LjckuVYX-1655351348661)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/104d286d466f4ee7bc70a3c7dde6984a~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]

实现 MyExclude

接着我们就按照js的逻辑来实现ts的代码

首先我们需要去循环 T 的每一项并且和 U 中的每一项做一个对比,相同的话就会被剔除,不相同就会返回,那么在ts中我们要怎么去循环对比两个联合类型呢。

在ts中我们可以使用 extends 来对比两个类型的属性。对于extends的一般使用来说:

type Equal<X, Y> = X extends Y ? true : false; 
type Num = Equal<1, 1>; // true 
type Str = Equal<'a', 'a'>; // true 
type Boo = Equal<true, false>; // false 

我们可以通过它约束的能力配合三元表达式来做一个简单的值对比,当 X 的类型 都存在于 Y 中的时候,三元表达式就会返回 true,否则返回 false。

并且在映射类型当中,当我们用一个泛型去extends另一个泛型的时候,会将每一个位置上的值都进行比对,并且返回一个联合类型。我们来举一个小例子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ouwNmxee-1655351348661)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6a806b8b7f584dc89edc676cf9b9bb30~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]

我们会发现当T1和T2相等的时候,返回的值就全是 true 的值,但是当两个值不相等的时候,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QuUqz0zT-1655351348661)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/179a1caf13aa4bf9a3694918651cc65e~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]

返回的却不是只有 false 的值,而是两个的联合类型,这样我们就能够知道,我们应该怎么去写这个 MyExclude 工具方法。

根据js中的逻辑,当两个值不相等的时候,返回,也就是 T。当两个值相等的时候,不做返回,也就是 never。

type MyExclude<T, U> = T extends U ? never : T; 

可以看到这样之后,测试代码已经不会报错了,并且我们自己试用一下 MyExclude 也能够返回正确的结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vyi7qmCN-1655351348661)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9902461d4f194a46935b168199c59b4c~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]

知识点

关于上述提到了部分的知识点:

  1. extends
  2. 三元表达式

今天提到的新知识点就是 extends 以及 三元表达式 具体的介绍大家可以看一下文档,这里放上官方文档中关于 条件类型 的文档。

TypeScript: Documentation - Conditional Types (typescriptlang.org)

总结

今天我们认识了 typescript 中的条件类型,作用和使用方法都和 JS 中的三元表达式特别相似,进行一定的对比学习会对我们对它的理解更加的深刻。

【ORB_SLAM系列4】—— 一文搞定如何在Ubuntu20.04中安装运行ORB_SLAM3(包含ROS版本和非ROS版本) ORB-SLAM3是一款基于特征点的实时单目SLAM系统,是SLAM领域的研究热点之一。它的核心算法是结合了ORB特征点提取和描述子匹配、单目RGB相机的深度估计、运动估计和地图优化等步骤,能够在实时性和精度之间取得平衡,适用于各种环境下的定位和建图任务。在各种应用领域都有广泛的应用。本教程主要是介绍了关于在ubuntu20.04中运行ORB_SLAM3的所有依赖的库的安装过程,和所遇到的一些报错的解决方法。有什么问题,可以评论区里面交流讨论 阅读详情

相关推荐

从一个 ASIN 看透亚马逊:商品模型背后的增长飞轮

在亚马逊电商体系中,每件商品背后都有一套严密的商品建模逻辑。本篇文章以“ASIN 的一生”为线索,系统拆解了亚马逊的商品模型:从飞轮战略出发,剖析 SDP(Single Detail Page)机制如何实现标准化展示;再到 ASIN 编码、父子变体结构与 Offer 分离模型,逐层解析商品信息如何被建构、聚合与呈现。通过图解与案例,文章帮助读者理解商品建品流程、同款聚合原则、价格控制机制等核心逻辑,避免常见运营误区,是一份面向运营、产品、技术人员的实用参考指南。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

TypeScript类型体操1.github easy 4-pick

TS类型体操challengs

weixin_43995121的博客 448

人工智能-语音识别-韵律信息在汉语语音识别中的应用.pdf

人工智能-语音识别-韵律信息在汉语语音识别中的应用.pdf

【ts类型体操】03057-easy-push

需求:在类型系统里实现通用的 Array.push 。 type Push<T extends any[], U> = any import type { Equal, Expect } from '@type-challenges/utils' import { ExpectFalse, NotEqual } from '@type-challenges/utils' type cases = [ Expect<Equal<Push<[], 1>, [1]

qq_45679015的博客 444

TS类型体操 之 中级类型体操挑战收官之战

TS类型体操中等题目最后收官了,对于最后一类型的题目在于理解反向推到类型和“无中生有”变出来的泛型变量。 掌握后就能更好的理解“困难级”的体操题目了~

Jioho的博客 1111

TypeScript 类型体操

有点 Object.keys 那意思,用作获取 interface 和对象类型的 “键”

weixin_45368328的博客 626

TS 类型体操还能这么玩,太秀了

这篇文章通过几道例题,带大家领略了 TS 的风采,也看到了 TS 的弊端:计算能力,在使用 TS 过程中,我们要巧用辅助变量遇到计算时大胆使用['length']诡异字符串操作多用模版字符串infer + 递归大杀器好了本文的内容就这么多了,更多关于 TS 的内容,以后再说,随缘更新!最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。有需要的小伙伴,可以点击下方卡片领取,无偿分享。

郊眠寺 3424

Typescript 类型编程,从入门到念头通达

前言探索经历我不知道我不知道我曾经以为 Tyepscript 只是在 Javascript 基础上加一些类型注释,是 JavaScript 的增强版而已,属于有手就会。我知道我不知道直到我用到了 Prisma 这个 NodeJS ORM 工具,其生成的类型定义,可以根据你的参数,完美应对关联查询、部分查询等各种场景,完全吊打其他 NodeJS ORM。出于好奇,我看了以下源码:这还是我认识的 Ty...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 471

type-challenges类型体操15题(一)

这个专栏会持续更新,github上的type-challenges,每次15道题,通过练习让你掌握类型编程.

xkl_123的博客 1621

ts类型体操 43 - Exclude

【代码】ts类型体操 43 - Exclude

包磊磊的博客 599

TS(TypeScript) 类型体操: 4518 - Fill 题解

TypeScript (TS) 类型体操 4518 - Fill 题解:跟着我的思路一步步推出最终题解

weixin_47693562的博客 463

ts类型体操 Awaited

【代码】ts类型体操 Awaited。

包磊磊的博客 777

类型体操 | typescript炫技 | 练习题

类型体操 两数之和 包括定义加法 减法 获取数组除了第一个元素尾部 数组转联合类型 // ts => LeetCode第一题: 两数之和 type TwoSum<A extends number[], T extends number> = A['length'] extends 0 ? false : Sub<T, A[0]> extends Arr2Union<Tail<A>> ? true : TwoS

qq_44326745的博客 690

【ts类型体操】00014-easy-first

需求:实现一个通用First<T>,它接受一个数组T并返回它的第一个元素的类型。 type First<T extends readonly any[]> = any import type { Equal, Expect } from '@type-challenges/utils' type cases = [ Expect<Equal<First<[3, 2, 1]>, 3>>, Expect<Equal<Fir

qq_45679015的博客 1228

TS实现 Exclude和extends解析

中的类型,来构造一个新的类型类型,但不能直接使用它本身。

content6的博客 1173

TypeScript 类型体操练习(一)

实现一个 IF 类型,它接收一个条件类型 C ,一个判断为真时的返回类型 T ,以及一个判断为假时的返回类型 F。在类型系统里实现 JavaScript 内置的 Array.concat 方法,这个类型接受两个参数,返回的新数组类型应该按照输入参数从左到右的顺序合并为一个新的数组。在类型系统里实现 JavaScript 的 Array.includes 方法,这个类型接受两个参数,返回的类型要么是 true 要么是 false。从联合类型 T 中排除 U 中的类型,来构造一个新的类型

qq_45693419的博客 919

TS 类型体操:图解一个复杂高级类型

今天就来做个高难度的体操,它会综合运用模式匹配、构造、递归等套路,对提升类型编程水平很有帮助。 我们要实现的高级类型如下: 它的类型参数是参数字符串 query string,会返回解析出的参数对象,如果有同名的参数,会把值做合并。 先不着急实现,我们先回顾下相关的类型体操基础: 类型体操基础 模式匹配 模式匹配是指用一个类型匹配一个模式类型来提取其中的部分类型到 infer 声明的局部变量中。 比如提取 a=b 中的 a 和 b: 这种模式匹配的套路在数组、字符串、函数等类型中都有很多应用。 构造 映

开源世界 1007

11. TypeScript 条件类型

TypeScript 条件类型 1. 条件类型基本使用 // 可以使用extends关键字和三元表达式,实现条件判断 interface Fish { name1: string } interface Water { name2: string } interface Bird { name3: string } interface Sky { name4: string } type Condition<T> = T extends Fish ? Water : Sky; /

舜岳的博客 702

TypeScript中使用Exclude的9种方法

作为一名TypeScript开发者,我经常被问到很多关于TypeScript工具类型的问题——尤其是如何在应用程序代码中使用它们。所以,我开始了一个关于它们的系列——围绕现实世界的例子。让我们从Exclude类型帮助器开始。可以使用Exclude删除联合的单个成员。第一个参数表示完整的联合,第二个参数表示要删除的成员。从技术上讲,第二个参数可以是任何类型——如果你试图删除一个不存在的成员,TypeScript不会警告你。它只会返回原来的组合。

专注于认知和效率提升方面的分享 2278

【ts】typescript高阶:分布式条件类型

学习目标: 1、条件类型语法和例子 2、分布式条件类型语法和例子 3、什么是类型?什么是函数重载?ts中的条件类型可以类比js中的三元表达式 2、条件类型的应用例子 二、2、分布式条件类型语法和例子 1.分布式条件类型语法 1、语法和正常条件类型一样,不一样的是在于T类型参数的特性上 2、注意对于类型参数T而言除了T[]、[T]、 Promise三种类型外的其他类型都是“裸”类型参数,即需要进行分布式匹配代码如下(示例): 2.分布式条件类型应用例子 代码如下(示例): "裸"类型参数进行分布式匹配 非

qq_48896417的博客 1248

【ts类型体操】00011-easy-tuple-to-object

需求:传入一个元组类型,将这个元组类型转换为对象类型,这个对象类型的键/值都是从元组中遍历出来。 type TupleToObject<T extends readonly any[]> = any import type { Equal, Expect } from '@type-challenges/utils' const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const type cases = [ Ex

qq_45679015的博客 647
上一篇: typeof 与 instanceof 区别
下一篇: uniapp map 制作一个简单的地图导航
梅花十三儿
博客等级 码龄5年 1035粉丝 · 444原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值