ts补充
// ts中类型主要包括 1.元组 2.接口(对象,函数,构造器)类型 3.枚举类型 4.字面量类型 5.特殊类型
// ts中类型类型运算主要包括 1.条件类型 : 2.推导类型 3.联合类型 4.交叉类型 5.映射类型
特殊类型
- never 代表不可达,比如函数抛异常的时候,返回值就是 never。
- void 代表空,可以是 undefined 或 never。
- any 是任意类型,任何类型都可以赋值给它,它也可以赋值给任何类型(除了 never)。
- unknown 是未知类型,任何类型都可以赋值给它,但是它不可以赋值给别的类型。
extends 的不同用处
// extends ? : 条件类型
// extends class 类继承
// T extends string 类型约束
// infer 推导类型
// | 联合类型
// & 交叉类型
// key of 映射类型
type MapType<T> = { [Key in keyof T]?: T[Key] }
keyof T 是查询索引类型中所有的索引,叫做索引查询
T[Key] 是取索引类型某个索引的值,叫做索引访问
//取出props类型
type GetRefType<P> = 'ref' extends keyof P ? P extends {ref : infer Value|undefined} ? Value : never : never
type ImplRefType = GetRefType<{name:"ws",ref:'ws'}>
类型约束例子
// function getPv(obj,key){
// return obj[key]
// }
// function getpv<T>(obj:T,key:any):any{
// return obj[key]
// }
function getPv<T extends object,Key extends keyof T>(obj:T,key:Key):T[Key]{
return obj[key]
}
getPv({a:1,b:2},'a')
// ts 子类型 父类型
//模式匹配
type GetReturnType<T> = T extends (...args:unknown[])=> infer ReturnType ? ReturnType : never
type Type = GetReturnType<()=>string>
//递归
type GR<T extends string> = T extends `${infer A}${' '}` ? GR<A> : T
type GL<T extends string> = T extends `${' '}${infer A}` ? GL<A> : T
type A = GL<GR<' ws '>>
type obj = {
a: {
b: {
c: {
f: () => 'dong',
d: {
e: {
guang: string
}
}
}
}
}
}
type DeepReadOnly<T extends Record<string,any>> = {
readonly [key in keyof T] :T[key] extends object ? T[key] extends Function ? T[key] : DeepReadOnly<T[key]> :T[key] }
type DRR = DeepReadOnly<obj>
//重新构造
type UppercaseKey<T extends object> = {
[Key in keyof T as Uppercase<Key & string>] : T[Key]
}
// key in 'NAME'|'AGE'
type GG = UppercaseKey<{name:string;age:number}>
type Change<T> = {
[Key in keyof T as `${Key & number}` ]:[T[Key],T[Key]]
}
type v = Change<{1:1,3:2}>
type AppendArgument<T,U> = T extends (...args:infer Args)=>infer A ? (...args:[...Args,U])=> A:never
type AppendArgumentResult = AppendArgument<(name:string)=>string,number>
type ToRe<T> = {
-readonly [key in keyof T] -?: T[key]
}
type Ad = ToRe<{
readonly a?:string;
readonly b?:number
}>
interface P {
name:string;
age:number;
hobby:string[];
}
type Filter<T extends Record<string,any>,U> = {
[key in keyof T as U extends T[key] ? key :never]:T[key]//此处包含联合类型的特性
}
type FilterRt = Filter<P,string|number>
type JJ = string|number extends string ? true :false
//联合类型
联合类型比较特殊 会有分布式条件类型A extends A ? [B] extends [A] ? false : true : never
当 A 是联合类型时:
- A extends A 这种写法是为了触发分布式条件类型,让每个类型单独传入处理的,没别的意义。
- A extends A 和 [A] extends [A] 是不同的处理,前者是单个类型和整个类型做判断,后者两边都是整个联合类型,因为只有 extends 左边直接是类型参数才会触发分布式条件类型。
至于为什么要用[A]这总形式 其实在ts被解析的时候底层会直接传入是不是T(也就是联合类型) 如果是就按照分布式情况处理 如果不是就正常处理所以 以下都可以防止触发分布式条件类型
A extends A ? [B] extends [A] ? false : true : never
A extends A ? {ws:B} extends {ws:A} ? false : true : never
A extends A ? (()=>B) extends (()=>B) ? false : true : never
type UppercaseA<T extends string> = T extends 'a' ? Uppercase<T> : T
type UppercaseAR = UppercaseA<'a'|'b'|'c'>
type IsUnion<A,B=A> = A extends A ? [B] extends [A] ? false : true : never
type IsUnionR = IsUnion<'a'|'b'>
//这个可以验证分布式条件类型
type TestUnion<A, B = A> = [B] extends [B] ? { a: A, b: B} : never;
type TestUnionResult = TestUnion<'a' | 'b' | 'c'>;
// 内置类型
// Parameters
// type Parameters<T extends (...args: any) => any>
// = T extends (...args: infer P) => any
// ? P
// : never;
type TestParameters = Parameters<(name:string,age:never)=>void>
//Partial Readonly Required
//Pick
// type Pick<T, K extends keyof T> = {
// [P in K]: T[P];
// };
type TestPick = Pick<{name:'ws',age:10,ddd:'12'},'name'|'age'>
//Record
// type Record<K extends keyof any, T> = {
// [P in K]: T;
// };
type TestRecord = Record<'a'|'b',string>
type TestRecord2 = Record<string,any>
//Exclude
// type Exclude<T, U> = T extends U ? never : T;
type TestExclude = Exclude<'a'|'b'|'c','a'|'b'>
//Extract
// type Extract<T, U> = T extends U ? T : never;
type TestExtract = Extract<'a'|'b'|'c','a'|'b'>
//Omit
// type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
type TestOmit = Omit<{name:'ws',age:10,ddd:'12'},'name'|'age'>
//协变 逆变 //协变
interface Person {
name: string;
}
interface Ws {
name: string;
age: number;
}
let person: Person = {
name: '',
};
let wangs: Ws = {
name: 'ws',
age: 20,
};
person = wangs;
// wangs = person;
//逆变
let printHobbies: (ws: Ws) => void;
printHobbies = (ws) => {
console.log(ws.age);
}
let printName: (person: Person) => void;
printName = (person) => {
console.log(person.name);
}
// printName = printHobbies
printHobbies = printName
// printHobbies()
type Func = (a: string) => '1';
const func: Func = (a: 'hello') => string
// type UnionToIntersection<U> =
// (U extends U ? (x: U) => unknown : never) extends (x: infer R) => unknown
// ? R
// : never
// type UnionToIntersectionTest = UnionToIntersection<{ws:1}|{wsss:2}>
extends
// type ad = 'a'&'b' extends 'a' ? true :false; // type add = 'a' extends 'a'|'b' ? true :false type addf= ['a'|'b'] extends ['a'] ? true :false type addd= 'a'|'b' extends 'a' ? true :false
// type l = { // name:string, // } type DD = {a:'1111',b:'2'} extends {} ? true :false
// 子类型一定比父类型更具体
// type fff = ['a','b','c'][number] // type GG = fff extends 'a'|'b'|'c' ? true :false // type SSS = {1:1,2:2,3:3} extends {1:1} ?true :false // type EE = {a:2}
ts补充的更多相关文章
- TS 自学笔记(一)
TS 自学笔记(一) 本文写于 2020 年 5 月 6 日 日常废话两句 有几天没有更新了,最近学的比较乱,休息了两天感觉好一些了.这两天玩了几个设计软件,过几天也写篇文章分享分享. 为啥要学 TS ...
- SnowflakeId雪花ID算法,分布式自增ID应用
概述 snowflake是Twitter开源的分布式ID生成算法,结果是一个Long型的ID.其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器I ...
- TypeSrcript如何引入第三方库 如果加d.ts以及async await如何使用 demo,只有代码,文字后续补充
https://files.cnblogs.com/files/cappuccino/laya2.rar
- TS中补充的六个类型
1. 元组 元组可以看做是数组的拓展,它表示已知元素数量和类型的数组.确切地说,是已知数组中每一个位置上的元素的类型 当我们为 元组 赋值时:各个位置上的元素类型都要对应,元素个数也要一致. let ...
- TS初探
简介 TypeScript具有类型系统,且是JavaScript的超集.它可以编译成普通的JavaScript代码. TypeScript支持任意浏览器,任意环境,任意系统并且是开源的.Ts主要用于解 ...
- JavaScript 和 TypeScript 交叉口 —— 类型定义文件(*.d.ts)
在 <从 JavaScript 到 TypeScript 系列> 文章我们已经学习了 TypeScript 相关的知识. TypeScript 的核心在于静态类型,我们在编写 TS 的时候 ...
- [补充资料] 手动搭建 Cloudera 集群
本课主题 集群搭建 设置 Web 服务器 启动 ClouderManager 登入 Cloudera Manager 引言 这部份是一个补充资料,记录如何安装 Cloudera 服务器 集群搭建 查看 ...
- 第一阶段——CentOS6_Python3.6.1笔记(尚学堂-Python基础快速入门)+ 【补充】麦子-Python程序入门与进阶
虚拟机环境: 设置网络 .修改网络地址 .设置网卡为nat模式 .确保物理机启动dhcp.net服务 .编辑文件:vim /etc/sysconfig/network-scripts/ifcfg-et ...
- (原)关于MEPG-2中的TS流数据格式学习
关于MEPG-2中的TS流数据格式学习 Author:lihaiping1603 原创:http://www.cnblogs.com/lihaiping/p/8572997.html 本文主要记录了, ...
- [视频播放] HLS协议之M3U8、TS流详解
本文转载自:<hls之m3u8.ts流格式详解> HLS,Http Live Streaming 是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部 ...
随机推荐
- 添加matlab到右键菜单并从当前目录打开
前言 因为每次打开matlab都得切换一下工作目录,由于目录不固定,所以感觉会很麻烦,所以就想着怎么添加matlab到右键菜单,并从指定目录打开,不过网上没有关于怎么设置这个的,不过却又很多设置cm ...
- 记maven打包加入外部jar后tomcat运行失败问题
环境:maven 3.8.0 .tomcat 8.5.30 因为项目需要额外的引用外部jar,需要打包到war中. 所以在pom中加入了 <webResources> <resour ...
- Pyqtgraph入门
一.介绍 1.1 什么是pyqtgraph? PyQtGraph是Python的图形和用户界面库,它充分利用PyQt和PtSide的高质量的图形表现水平和NumPy的快速科学计算与处理能力,在数学.科 ...
- qt5 windeployqt.exe 部署后的程序,运行时仍然报错的问题 (无法定位程序输入点 _ZdlPvj)
首先,注意自己编译执行程序所用的Qt版本: 上图 QTDIR 其次,部署后的执行程序运行时需要 libgcc_s_dw2-1.dll ,从对应的 QT目录拷一个. 最后,要在Qt自己的命令行下运行 w ...
- navicat图形工具和pymysql模块的使用
一 Navicat 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作MySQL数据库 官网下载:http ...
- List集合增删元素时,UnsupportedOperationException报错问题
我的情况是这样:从数组转集合,操作集合删除元素. // Tab页面标题第一步:String[] mTitles = getResources().getStringArray(R.array.lead ...
- 配置Centos8网络绑定
配置Centos8网络绑定 原理: 在物理网卡两块之上创建一块虚拟主卡, 逻辑上是一主双从, 按不同的模式负载运行,常用模式如主备或并行提供双倍带宽等.模式: 可选参数"mode=act ...
- kaola
考拉布局 CSS <style> * { margin: 0; padding: 0; } body { background-color: #f5f5f5; } .clearfix:af ...
- 升级TLS1.3
初衷:简简单单在网站上挂个单点登录,先在本地跑起来,然后再放到服务器上.然而问题来了: 请求被中止: 未能创建 SSL/TLS 安全通道 简简单单的百度一下,只需要加上这行就可以了~Easy Serv ...
- 更改材质uv