typescript泛型---下

typescirpt泛型—下

联合类型

联合类型字面量

联合类型由两个或者两个以上的成员类型构成,各个成员类型之间是通过竖线分隔

type NumericType = number | bigint
type T = boolean | string[] | {x: number} | (() => void)

联合类型的类型成员

属性签名
interface Circle {
    area: number;
    radius: number
}
interface Rectangle {
    area: number;
    width: number;
    height: number;
}
type Shape = Circle | Rectangle

area的类型为Circle类型中的area属性和Rectangle类型中的area属性。

interface Circle {
    area: bigint
}
interface Rectangle {
    area: number
}
declare const s: Circle | Rectangle
s.area // bigint | number

如果联合属性签名在某个成员类型中是可选属性签名,那么在该属性签名在联合类型中也是可选属性签名。

interface Circle {
    area: bigint;
}
interface Rectangle {
    area?: number
}
declare const s: Circle | Rectangle
s.area // bigint | number | undefined
索引签名

索引签名包括两种,字符串索引签名和数值索引签名。
如果联合类型中每个成员都包含字符串索引签名,那么该联合类型也有了字符串索引签名。

interface T0 {
    [prop: string]: number;
}
interface T1 {
    [prop: string]: bigint
}
type T = T0 | T1
interface T0T1{
    [prop: string]: number |bigint;
}

T相当于接口类型T0T1

调用签名与构造签名

如果联合类型为每个成员类型都包含了相同参数列表的调用签名,那么联合类型也拥有了该调用签名。返回值为每个成员类悉尼港中调用签名返回值类型的联合类型。

interface T0 {
    (name: string): number
}
interface T1 {
    (name: string): bigint
}
type T = T0 | T1
interface T0T1 {
    (name: string): number | bigint
}

如果联合类型中每个成员都包含相同参数列表的构造签名,那么该联合类型也拥有了构造签名,其返回值类型为每个成员类型中构造签名返回值类型的联合类型

interface T0 {
    new (name: string): Date
}
interface T1 {
    new (name: string): Error
}
type T = T0 | T1
interface T0T1 {
    new (name: stirng): Date | Error
}

交叉类型

交叉类型字面量

交叉类型由两个或多个类型构成。

interface Clickable {
    click(): void
}
interface Focusable {
    focus(): void
}
type T = Clickable & Focusable

若一个值既是Clickable类型又是Focusable类型,那么我们说该值的类型为交叉类型

成员类型的运算

和联合类型相似,如果交叉类型中存在多个相同的成员类型,那么相同的成员类型被合并为单一的成员类型

interface Clickable {
    click(): void
}
interface Focusable {
    focus(): void
}
type T0 = Clickable & Focusable;
type T1 = Focusable & Clickable;

成员类型的顺序不影响交叉类型的结果类型。当交叉类型设计调用签名或构造函数重载的时候,成员类型的顺序决定了重载的顺序。从而影响重载签名的解析顺序

interface Clickable {
    register(x: any): void
}
interface Focusable {
    register(x: string): boolean
}
type ClickableAndFocusable = Clickable & Focusable
type FocusableAndFocusable = Focusable & Clickable
function foo (
    clickFocus: ClickableAndFocusable,
    focusClick: FocusableAndFocusable
) {
    let a: void = clickFocus.register('foo')
    let b: boolean = focusClick.register('foo')
}
原始类型

交叉类型通常和对象类型一起使用,虽然在交叉类型中也允许使用原始类型成员,但是结果类型将成为never类型。

type T = boolean & number & string

交叉类型的类型成员

属性签名

只要交叉类型中的任意一个成员类型包含了属性签名M,那么交叉类型也包含属性签名M

interface A {
    a: boolean 
}
interface B {
    b: string
}

A & B = {a:boolean; b: string}

索引签名
interface A {
    [prop: stirng]: string
}
interface B {
    [prop: number]: string
}

A&B

{
    [prop: string]: string,
    [prop: number]: string
}
interface A {
    [prop: stirng]: {a: boolean}
}
interface B {
    [prop: string]: {b: boolean}
}

A&B

{
    [prop: string]: {a: boolean} & {b: boolean}
}
调用签名与构造签名
interface A {
    (x: number): number;
}
interface B {
    (x: string): string;
}

A & B

{
    (x: boolean): boolean;
    (x: string): boolean
}

B & A

{
    (x: string): string
    (x: boolean): boolean
}

优先级: & > |

索引类型

keyof Type
interface Point {
    x: number;
    y: number
}
type T = keyof Point // "x" | "y"

索引类型查询

javascript中的对象是键值对的数据结构,只允许字符串和symbol值作为对象的键,索引类型查询获取的是对象的键的类型,只有此索引类型查询结果类型为"string | symbol",但是数组类型十分常用而且索引值的类型为number类型,因此编译器将number类型纳入了索引类型查询的结果类型范围。
如果类型t中包含字符串缩影签名,那么string类型和number类型添加到keyof T

interface T {
    [prop: string]: number
}
// string | number
type KeyofT = keyof T 

如果类型T中包含属性名类型为"unique symbol"的属性,那么将"unique symbol"类型添加到类型keyof T,如果想要在对象类型中声明属性为symbol类型的属性,那么属性名的类型必须为unique symbol类型。不允许symbol类型。

const s: unique symbol = Symbol() 
interface T {
    [s]: boolean
}
// string | number | symbol 
type keyofT = keyof T;
interface T {
    0: boolean;
    a: stirng;
    b(): void
}
// 0 | 'a' | 'b'
type KeyOfT = keyof T

当对any使用索引类型查询的时候,结果类型固定为联合类型"string | number | symbol"

type KeyofT = keyof any; // string | number | symbol

当unknown类型使用索引类型查询的时候,结果类型固定为never类型

type KeyofT = keyof unknown //never

索引访问类型

const s: unique symbol = Symbol()
enum E {
    A = 10
}
type T = {
    0: string;
    x: boolean;
    [E.A]: number;
    [s]: bigint
}
type TypeOfNumberLikeName = T[0] //string
type TypeofStringLikeName = T['x'] // string 
type TypeofEnumName = T[E.A] // number
type TypeofSymbolName = T[typeof s] // bigint

映射对象类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/750394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2.0项目安装依赖 sass 报错

1、报错代码: 2、原因:项目有点老,vue2的版本,所以node-sass在npm安装的时候大概率的会安装出错,或下载时间过长,因此考虑用dart-sass来替换。 npm install node-sassnpm:dart-sass3、然后就可以成功运行了…

【PTA】7-1 网红点打卡攻略(C/C++)代码实现 反思

解题细节分析: 0.比较图的两种存储方法,通过邻接矩阵存储更便于查找给定两点之间的关系 1.注意理解清楚题义:“访问所有网红点”中所有不是指攻略中所有,而是存在的全部的网红点 代码见下:// 需要注明的是&#xff…

音频剪辑技巧:音频降噪在线怎么降噪?分享7种录音去除杂音方法

相信很多小伙伴们都有这种苦恼:在编辑音频时,你可能发现即使你使用了价格昂贵的隔音麦克风,在录音中仍然存在呼吸声和咳嗽声。因此,如果要传达清晰干净的声音以表达你的信息,你该如何从录音去除杂音呢?别心…

理清时间复杂度和空间复杂度

目录 复习时间 幂函数 指数函数 对数函数 ​编辑 时间复杂度 推导阶的原则 常见的时间复杂度举例 常数阶 O(1) 对数阶 O(logn) 平方阶 O(n^2) 图像表示 空间复杂度 常见的空间复杂度举例 常数阶 O(1) 线性阶 O(n) 平方阶 O(n^2) 一个算法的优劣主要从算法的执行时间和所需要占…

elementUI的衍生组件,avue的crud表格错位问题

问题描述: 每次从别的页面跳转回来就发现表格显示错位了 一通查 结果发现是有两层表格 解决办法: 根据开发者工具中看到的样式选择器,很粗暴的在全局样式文件中加一个: 效果:

CDP问卷的常见问题

CDP问卷的常见问题可以归纳如下: 哪些企业会收到CDP邀请? 企业会收到来自投资和/或采购机构的邀请,以填写CDP问卷并披露相应的环境管理信息。 未收到邀请的企业可否填报? 未收到邀请的企业可以选择自行填报。他们需发送申请自愿…

[论文阅读笔记33] Matching Anything by Segmenting Anything (CVPR2024 highlight)

这篇文章借助SAM模型强大的泛化性,在任意域上进行任意的多目标跟踪,而无需任何额外的标注。 其核心思想就是在训练的过程中,利用strong augmentation对一张图片进行变换,然后用SAM分割出其中的对象,因此可以找到一组图…

Session会话与请求域的区别

session会话和请求域(也称为request域)都是用于存储和管理用户特定信息的重要概念,但它们在作用范围和生命周期上有显著的不同。 请求域 (Request Domain) 作用范围:请求域是面向单次请求的。每次HTTP请求都会创建一个新的request…

【实战教程】如何使用JMeter来轻松测试WebSocket接口?

1、websocket接口原理 打开网页:从http协议,升级到websocket协议,请求建立websocket连接服务器返回建立成功成功客户端向服务端发送匹配请求服务端选择一个客服上线服务器返回客服id客户端向服务器发送消息服务器推送消息给指定的客服服务器…

EXCEL快速填充空白内容

** EXCEL快速填充空白内容 ** 1.全选所有需要填充的内容,按住电脑的F5或者CTRLG点击定位 2.可以看到空白处被自动选定,之后按电脑和⬆,最后CTRLenter 可以看到空白处已经被填充。

C#——this关键字详情

this关键字 在 C# 中,可以使用 this 关键字来表示当前对象,日常开发中我们可以使用 this 关键字来访问类中的成员属性以及函数。 使用this表示当前类的对象 执行结果 使用 this 关键字串联构造函数 执行结果 使用 this 关键字作为类的索引器 执行结果 …

02逻辑代数与硬件描述语言基础

2.1 逻辑代数(简单逻辑的运算) 2.2 逻辑函数的卡诺图(从图论的角度)化简法 2.3 硬件描述语言Verilog HDL基础(研究生阶段才用得到) 要求: 1、熟悉逻辑代数常用基本定律、恒等式和规则。 2、掌握…

蒸汽架空管道中的关键守护者:滑动管托、导向管托与固定管托

蒸汽架空管道中的关键守护者:滑动管托、导向管托、固定管托与补偿器的重要角色在蒸汽架空管道系统中,每一个组件都扮演着不可或缺的角色,共同确保管道的安全、高效运行。今天,我们就来深入探讨滑动管托、导向管托、固定管托以及补…

用一个实例看如何分享大量照片 续篇二,关于Exif (Exchangeable Image File) - 可交换图像文件

续篇二:说说关于照片隐含的 Exif (Exchangeable Image File) 可交换图像文件 数码照片的Exif 参数有很多,重要的Exif信息:拍摄日期、时间、拍摄器材、GPS信息。 当然这主要对自己的档案有意义,如果放到网上还是建议抹去这些信息。…

50etf期权合约一手多少钱你知道吗?

今天带你了解50etf期权合约一手多少钱你知道吗?50etf期权有不同价值的合约,每手50etf期权合约从几元到几百元再到上千元的都有,具体需要根据投资者选择了什么价值的合约。 50etf期权权利金 50ETF期权合约的权利金是买方需要缴纳的费用&…

Asm动态生成类和get and set方法

asm在解析文件的时候是按照特定顺序进行分析的,首先是visit方法,做类相关的解析,然后是注解,然后是属性,最后才是方法,属性是在所有方法分析前面进行,也就是只有当class文件中的所有属性都遍历完…

GMSB文章五:微生物组差异分析ANCOMBC-2

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 微生物的物种差异分析是一项关键的生物信息学任务,旨在识别不同生物群落或样本组…

讯飞星火企业智能体平台正式发布,打造每个岗位专属AI助手

大力财经 | 发布 讯飞星火V4.0来了!6月27日,科大讯飞在北京发布讯飞星火大模型V4.0及相关落地应用。讯飞星火V4.0七大核心能力全面提升,整体超越GPT-4 Turbo,在8个国际主流测试集中排名第一,国内大模型全面领先。 大模…

代码随想录算法训练营第三十六天|62.不同路径、 63. 不同路径 II、343.整数拆分(可跳过)、96.不同的二叉搜索树(可跳过)

62.不同路径 题目链接:62.不同路径 文档讲解:代码随想录 状态:还行 思路:当前状态的只有可能是从上面或者左边过来的,所以 dp[i][j] dp[i-1] dp[j-1] 题解: public int uniquePaths(int m, int n) {if (…

入职必备-mac下载安装maven

1、Maven 下载 1.1、官网下载安装包 官网下载链接 历史版本下载: Index of /dist/maven/maven-3/3.8.8/binaries 注意 .bash_profile 文件中的符号可能会影响配置 1.2、解压文件 2、Maven 环境配置 2.1、Java JDK 依赖 配置 maven 环境变量需要先配置好 JDK …