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.mzph.cn/web/35574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 算法交易实验73 QTV200第二步: 数据清洗并写入ClickHouse

说明 先检查一下昨天启动的worker是否正常工作,然后做一些简单的清洗,存入clickhouse。 内容 1 检查数据 from Basefuncs import * # 将一般字符串转为UCS 名称 def dt_str2ucs_blockname(some_dt_str):some_dt_str1 some_dt_str.replace(-,.).re…

【LeetCode】七、树、堆、图

文章目录 1、树结构2、二叉树3、二叉树的遍历4、堆结构(Heap)5、堆化6、图 1、树结构 节点、根节点、叶子节点: 高度、深度、层三者的示意图: 2、二叉树 相比其他树,二叉树即每个节点最多两个孩子(两个分…

Linux高级编程——进程

1.进程的含义? 进程是一个程序执行的过程,会去分配内存资源,cpu的调度 PID, 进程标识符 当前工作路径 chdir umask 0002 进程打开的文件列表 文件IO中有提到 (类似于标准输入 标准输出的编号,系统给0,1&#xf…

【UE5.3】笔记5-蓝图类

什么是蓝图类:其实就是C类,只不过是UE封装好的且可以直接拖出来可视化使用。 如何创建蓝图类?蓝图类有哪些? 蓝图类分为基于关卡的,基于Actor的,基于组件Component的。 基于关卡的蓝图类 一个关卡只能有…

涉案财物管理系统|DW-S405系统实现涉案财物科学化管理

随着社会的不断发展,犯罪形式日益复杂,涉案财物的种类和数量也不断增加。传统的涉案财物管理方式已经无法满足现代执法办案的需求。因此,建立一套科学、高效、规范的警用涉案财物管理系统成为公安机关亟待解决的问题。 涉案财物管理系统DW-S…

最近在读《谁说菜鸟不会数据分析 SPSS篇》pdf分享

谁说菜鸟不会数据分析 SPSS篇 《谁说菜鸟不会数据分析(SPSS篇)》继续采用职场三人行的方式来构建内容,细致梳理了准专业数据分析的常见问题,并且挑选出企业实践中最容易碰到的案例,以最轻松直白的方式来讲好数据分析的…

【Android面试八股文】你来说一说Looper、Handler、线程间的关系,一个线程可以有几个Looper可以对应几个Handler?

文章目录 Looper相关Handler相关总结结论:一个线程可以只能创建一个Looper,但是可以创建任意多个handler 对象。 Looper相关 Looper的创建是通过在线程中执行Looper.prepare()方法创建,那么这个方法到底做了什么呢?请看下面的代码: public static void prepare() {prepa…

智能卡与存储卡的静电保护方案

SIM卡和存储卡,如SD卡、MMC卡等,在现代电子设备中扮演着核心角色,存储着用户的身份信息、个人数据和多媒体文件,是设备正常运行的基石。然而,静电放电(Electrostatic Discharge, ESD)对这些卡片…

Spring相关面试题(二)

13.Spring IOC容器的加载过程 四个形态 概念态---<Bean信息>---> 定义态----BeanDefinition---->纯净态----DI---->成熟态 对应Bean的生命周期 实例化 --> 属性注入 ---> 实例化 概念态---->定义态 实例化一个ApplicationContext的对象 调用bean…

51单片机看门狗定时器配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;KEIL C51&#xff1b; 寄存器配置及主要代码 手册中关于看门狗的寄存器描述如下&#xff1a; 启动看门狗&#xff0c;需将B5位EN_WDT置1即可&#xff0c;…

postgresql.conf配置详解

postgresql.conf配置详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; postgresql.conf是PostgreSQL数据库的主要配置文件之一&#xff0c;它包含了各种配置…

ScheduledThreadPoolExecutor和时间轮算法比较

最近项目中需要用到超时操作&#xff0c;对于不是特别优秀的timer和DelayQueue没有看。 Timer 是单线程模式。如果某个 TimerTask 执行时间很久&#xff0c;会影响其他任务的调度。Timer 的任务调度是基于系统绝对时间的&#xff0c;如果系统时间不正确&#xff0c;可能会出现…

调和映照理论简介

调和映照理论 调和映照理论&#xff08;Harmonic Mapping Theory&#xff09;是数学中的一个重要分支&#xff0c;研究调和映照&#xff08;Harmonic Mapping&#xff09;及其性质。调和映照是指保持某种特定性质&#xff08;通常是调和性&#xff09;的映射&#xff0c;它在几…

Golang的Work Stealing机制

Go的运行时系统使用了一种名为Work Stealing&#xff08;工作窃取&#xff09;的调度策略来分配Goroutine到可用线程&#xff08;称为M&#xff0c;即Machine&#xff09;上执行。这样可以最大化CPU使用率&#xff0c;减少任务调度的开销。在这种机制下&#xff0c;任务队列和调…

STL中的迭代器模式:将算法与数据结构分离

目录 1.概述 2.容器类 2.1.序列容器 2.2.关联容器 2.3.容器适配器 2.4.数组 3.迭代器 4.重用标准迭代器 5.总结 1.概述 在之前&#xff0c;我们讲了迭代器设计模式&#xff0c;分析了它的结构、角色以及优缺点&#xff1a; 设计模式之迭代器模式-CSDN博客 在 STL 中&a…

Open AI限制来袭?用上这个工具轻松破局!

【导语】近日&#xff0c;AI领域掀起了一场不小的波澜。Open AI宣布&#xff0c;从7月9日起&#xff0c;将对部分地区的开发者实施API调用限制。这一消息对于许多依赖Open AI技术的国内初创团队来说&#xff0c;无疑是一个沉重的打击。 对于这些团队而言&#xff0c;Open AI的A…

FITC-胰岛素的荧光特性与稳定性-星戈瑞

在生物医学研究领域&#xff0c;荧光标记技术是一种实验手段&#xff0c;能够实现对生物分子的可视化追踪和定量分析。其中&#xff0c;FITC-胰岛素作为一种结合了荧光素异硫氰酸酯&#xff08;FITC&#xff09;与胰岛素的荧光标记物&#xff0c;在糖尿病研究、药物开发以及细胞…

关于摄像头模组中滤光片的介绍

1、问题背景 红外截止滤光片&#xff08;IR CUT Filter&#xff09;是应用在摄像头模组中非常重要的一个器件&#xff0c;因人眼与 coms sensor 对光线各波长的响应不同&#xff0c; 人眼看不到红外光&#xff0c;但 sensor 能感应到&#xff08;如下图是某sensor在各波长下的…

使用 SwiftUI 为 macOS 创建类似于 App Store Connect 的选择器

文章目录 前言创建选择器组件使用选择器组件总结前言 最近,我一直在为我的应用开发一个全新的界面,它可以让你查看 TestFlight 上所有可用的构建,并允许你将它们添加到测试群组中。 作为这项工作的一部分,我需要创建一个组件,允许用户从特定构建中添加和删除测试群组。我…

IOS Swift 从入门到精通:从 JSON 文件加载数据

文章目录 常见问题解答数据模型JSON 数据验证 JSON解码 JSON编写 FAQRow 代码添加状态栏背景模糊将内容添加到 FAQView常见问题解答数据模型 此 FAQ 模型符合Decodable,因为我们需要将 JSON 数据解码为 SwiftUI 数据。它还将符合 Identifiable ,因此我们稍后可以在 ForEach …