范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

TypeScript类型系统支持哪些类型和类型运算?

  我们知道 TypeScript 给 JavaScript 加了一套静态类型系统,还支持了泛型和各种类型运算逻辑。
  那么这个类型系统里都有哪些类型?支持哪些类型运算逻辑? TypeScript 类型系统中的类型
  静态类型系统的目的是把类型检查从运行时提前到编译时,那 TS 类型系统中肯定要把 JS 的运行时类型拿过来,也就是 number、boolean、string、object、bigint、symbol、undefined、null 这些类型,还有就是它们的包装类型 Number、Boolean、String、Object、Symbol。
  这些很容易理解,给 JS 添加静态类型,总没有必要重新造一套基础类型吧,直接复用 JS 的基础类型就行。
  复合类型方面,JS 有 class、Array,这些 TypeScript 类型系统也都支持,但是又多加了三种类型:元组(Tuple)、接口(Interface)、枚举(Enum)。 元组
  元组(Tuple)  就是元素个数和类型固定的数组类型:type Tuple = [number, string]; 接口
  接口(Interface)  可以描述函数、对象、构造器的结构:
  对象: interface IPerson {     name: string;     age: number; }  class Person implements IPerson {     name: string;     age: number; }  const obj: IPerson = {     name: "guang",     age: 18 }
  函数: interface SayHello {     (name: string): string; }  const func: SayHello = (name: string) => {     return "hello," + name }
  构造器: interface PersonConstructor {     new (name: string, age: number): IPerson; }  function createPerson(ctor: PersonConstructor):IPerson {     return new ctor("guang", 18); }
  对象类型、class 类型在 TypeScript 里也叫做索引类型,也就是索引了多个元素的类型的意思。对象可以动态添加属性,如果不知道会有什么属性,可以用可索引签名: interface IPerson {     [prop: string]: string | number; } const obj:IPerson = {}; obj.name = "guang"; obj.age = 18;
  总之, 接口可以用来描述函数、构造器、索引类型(对象、class、数组)等复合类型 。 枚举
  枚举(Enum)  是一系列值的复合:enum Transpiler {     Babel = "babel",     Postcss = "postcss",     Terser = "terser",     Prettier = "prettier",     TypeScriptCompiler = "tsc" }  const transpiler = Transpiler.TypeScriptCompiler;
  此外,TypeScript 还支持 字面量类型  ,也就是类似 1111、"aaaa"、{ a: 1} 这种值也可以做为类型。
  其中,字符串的字面量类型有两种,一种是普通的字符串字面量,比如 "aaa",另一种是模版字面量,比如  aaa${string}  ,它的意思是以 aaa 开头,后面是任意 string 的字符串字面量类型。
  所以想要约束以某个字符串开头的字符串字面量类型时可以这样写:
  还有四种特殊的类型:void、never、any、unknown: never  代表不可达,比如函数抛异常的时候,返回值就是 never。 void  代表空,可以是 undefined 或 never。 any  是任意类型,任何类型都可以赋值给它,它也可以赋值给任何类型(除了 never)。 unknown  是未知类型,任何类型都可以赋值给它,但是它不可以赋值给别的类型。
  这些就是 TypeScript 类型系统中的全部类型了,大部分是从 JS 中迁移过来的,比如基础类型、Array、class 等,也添加了一些类型,比如 枚举(enum)、接口(interface)、元组等,还支持了字面量类型和 void、never、any、unknown 的特殊类型。 类型的装饰
  除了描述类型的结构外,TypeScript 的类型系统还支持描述类型的属性,比如是否可选,是否只读等: interface IPerson {     readonly name: string;     age?: number; }  type tuple = [string, number?]; TypeScript 类型系统中的类型运算
  我们知道了 TypeScript 类型系统里有哪些类型,那么可以对这些类型做什么类型运算呢? 条件:extends ? :
  TypeScript 里的条件判断是  extends ? :  ,叫做条件类型(Conditional Type)比如:type res = 1 extends 2 ? true : false;
  这就是 TypeScript 类型系统里的 if else。
  但是,上面这样的逻辑没啥意义,静态的值自己就能算出结果来,为什么要用代码去判断呢?
  所以,类型运算逻辑都是用来做一些动态的类型的运算的,也就是对类型参数的运算。 type isTwo = T extends 2 ? true: false;  type res = isTwo<1>; type res2 = isTwo<2>;
  这种类型也叫做 高级类型  。
  高级类型的特点是传入类型参数,经过一系列类型运算逻辑后,返回新的类型。 推导:infer
  如何提取类型的一部分呢?答案是 infer。
  比如提取元组类型的第一个元素: type First = Tuple extends [infer T,...infer R] ? T : never;  type res = First<[1,2,3]>;
  注意,第一个 extends 不是条件,条件类型是  extends ? :  ,这里的 extends 是约束的意思,也就是约束类型参数只能是数组类型。
  因为不知道数组元素的具体类型,所以用 unknown。
  infer 在后面的章节会大量用到,这里先简单了解即可。 联合:
  联合类型(Union)类似 js 里的或运算符 |,但是作用于类型,代表类型可以是几个类型之一。 type Union = 1 | 2 | 3; 交叉:&
  交叉类型(Intersection)类似 js 中的与运算符 &,但是作用于类型,代表对类型做合并。 type ObjType = {a: number } & {c: boolean};
  注意,同一类型可以合并,不同的类型没法合并,会被舍弃:
  映射类型
  对象、class 在 TypeScript 对应的类型是索引类型(Index Type),那么如何对索引类型作修改呢?
  答案是 映射类型  。type MapType = {   [Key in keyof T]?: T[Key] }
  keyof T 是查询索引类型中所有的索引,叫做 索引查询  。
  T[Key] 是取索引类型某个索引的值,叫做 索引访问  。
  in 是用于遍历联合类型的运算符。
  比如我们把一个索引类型的值变成 3 个元素的数组: type MapType = {     [Key in keyof T]: [T[Key], T[Key], T[Key]] }  type res = MapType<{a: 1, b: 2}>;
  试一下
  映射类型就相当于把一个集合映射到另一个集合,这是它名字的由来 。
  除了值可以变化,索引也可以做变化,用 as 运算符,叫做 重映射  。type MapType = {     [         Key in keyof T              as `${Key & string}${Key & string}${Key & string}`     ]: [T[Key], T[Key], T[Key]] }
  我们用 as 把索引也做了修改,改成了 3 个 key 重复:
  试一下
  这里的 & string 可能大家会迷惑,解释一下:
  因为索引类型(对象、class 等)可以用 string、number 和 symbol 作为 key,这里 keyof T 取出的索引就是 string | number | symbol 的联合类型,和 string 取交叉部分就只剩下 string 了。就像前面所说,交叉类型会把同一类型做合并,不同类型舍弃。
  因为 js 处理对象比较多,所以索引类型的映射比较重要。 总结
  给 JavaScript 添加静态类型系统,那肯定是能复用的就复用,所以在 TypeScript 里,基础类型和 class、Array 等复合类型都是和 JavaScript 一样的,只是又额外加了接口(interface)、枚举(enum)、元组这三种复合类型(对象类型、class 类型在 TypeScript 里叫做索引类型),还有 void、never、any、unkown 四种特殊类型,以及支持字面量做为类型。此外,TypeScript 类型系统也支持通过 readonly、?等修饰符对属性的特性做进一步的描述。
  此外,TypeScript 支持对类型做运算,这是它的类型系统的强大之处,也是复杂之处。
  TypeScript 支持条件、推导、联合、交叉等运算逻辑,还有对联合类型做映射。
  这些逻辑是针对类型参数,也就是泛型(类型参数)来说的, 传入类型参数,经过一系列类型运算逻辑后,返回新的类型的类型就叫做高级类型 ,如果是静态的值,直接算出结果即可,没必要写类型逻辑。
  这些语法看起来没有多复杂,但是他们却可以实现很多复杂逻辑,就像 JS 的语法也不复杂,却可以实现很多复杂逻辑一样。
  后面我们会大量用到这些类型编程语法来实现各种复杂的类型逻辑。

3D打印让二维码可食用据eurekalert网站近日报道,日本大阪大学研究人员已经开发出一种方法,将一个不显眼的可食用标签嵌入食物中,无需先破坏食物即可读取。研究人员说,该方法的另一个主要优点是标签完全5大负载均衡算法(原理图解)负载均衡属于分布式架构的必备技术,也是进阶道路的必学技术,需要重点掌握mikechen下图是典型的集群和负载均衡架构图如果一台机器不能承受访问压力,我们很多时候会横向增加两台或者多3D打印让二维码可食用据eurekalert网站近日报道,日本大阪大学研究人员已经开发出一种方法,将一个不显眼的可食用标签嵌入食物中,无需先破坏食物即可读取。研究人员说,该方法的另一个主要优点是标签完全老二的前48年(53)这个基金公司还是非常厉害的,收购后没有什么大动作,先是派来了一个总经理,然后来了个财务总监,财务要牢牢抓在他们自己手里,最重要的销售队伍是丝毫未动,人还是原来的人,构架也是原来的构老二的前48年(53)这个基金公司还是非常厉害的,收购后没有什么大动作,先是派来了一个总经理,然后来了个财务总监,财务要牢牢抓在他们自己手里,最重要的销售队伍是丝毫未动,人还是原来的人,构架也是原来的构山东邹城首富22岁进国企,手握2家山东百强民企,年营收超420亿邹城市,山东省辖县级市,由济宁市代管。位于山东省西南部,是国家历史文化名城千年古县,是是著名思想家教育家孟子的故里。2021年,邹城市地区生产总值960。55亿元,按可比价格计算,山东邹城首富22岁进国企,手握2家山东百强民企,年营收超420亿邹城市,山东省辖县级市,由济宁市代管。位于山东省西南部,是国家历史文化名城千年古县,是是著名思想家教育家孟子的故里。2021年,邹城市地区生产总值960。55亿元,按可比价格计算,A股周线放出巨量的个股名单1海泰发展总市值26。36亿市盈(动)净利润2418。24万2中央商场总市值36。09亿市盈(动)368。08净利润490。18万3华光环能总市值95。71亿市盈(动)12。01净A股周线放出巨量的个股名单1海泰发展总市值26。36亿市盈(动)净利润2418。24万2中央商场总市值36。09亿市盈(动)368。08净利润490。18万3华光环能总市值95。71亿市盈(动)12。01净炒股的最高境界原本初是一位白领上班族。几年前看到身边的朋友炒股赚钱了,很是眼热。心想,这真是一条致富路呀。在低价位的时候买入,然后就抱着,等什么时候涨了再卖掉,躺着就把钱挣了,于是便有了一试身手炒股的最高境界原本初是一位白领上班族。几年前看到身边的朋友炒股赚钱了,很是眼热。心想,这真是一条致富路呀。在低价位的时候买入,然后就抱着,等什么时候涨了再卖掉,躺着就把钱挣了,于是便有了一试身手
68岁林青霞真高调,玫红色连衣裙剪出大领口,雍容华贵风韵犹存头条创作挑战赛上了年纪的女人,总是更加低调一些。毕竟身材气质颜值,都比不得年轻时候了。素雅的穿搭,反而更容易凸显出气质上的内敛和温和。对于女明星来讲,如果不争不抢。似乎就成了不进则穆雷11中2掘金主场险胜黄蜂,鲍尔海沃德复出了黄蜂要提升了12月19日NBA常规赛,掘金119115送给黄蜂8连败。约基奇得到40分27个篮板10次助攻。昨天下午单独分享的黄蜂方向满意了。曼联杨院长解说英超第一,穆雷还是老样子,状态差大伤突发!法国媒体曝出争议猛料,阿根廷第三粒进球无效,梅西很意外北京时间月日,卡塔尔世界杯传来突发消息,阿根廷通过点球大战75取胜法国,赛后,法国媒体RMC曝出争议猛料,由于多名替补球员进入球场,阿根廷第三粒进球应被判无效,这样的情况也是引起了世界杯闭幕式上,那一抹鲜艳的中国红,将是中国球迷最后的倔强世界杯闭幕式上,一抹鲜艳的中国红2022年卡塔尔世界杯足球赛决赛中,阿根廷队与法国队在常规时间和加时赛战成3比3平,通过点球大战,阿根廷队以总比分7比5获胜,夺得冠军。世界杯决赛落今天下午的一场有意思的CBA比赛20222023赛季CBA常规赛19日下午3。30进行了一场比赛,对阵的双方是辽宁本钢男篮与天津先行者男篮,经过48分钟的角逐最终辽宁男篮以118102获胜。伤病和病毒的影响今天双王楚钦新教练出炉!执教成绩与刘国正可匹敌,刘国梁重用事出有因头条创作挑战赛支持这样的变化吗?目前中国乒乓球队正式公布了参加亚洲区选拔赛参赛名单。这次德班世乒赛预选赛将会在卡塔尔举行,时间是1月7日至13日,由于赛事的重要性,乒协主席刘国梁会英达的父亲去世,巴图想去参加爷爷的葬礼,被英达一口拒绝当年英达的父亲去世,巴图想去参加爷爷的葬礼,英达一口拒绝,有人问为什么?英达说我不知道巴图到底还姓不姓英?宋丹丹一听,气得直跳脚14年了,你都没管过巴图,你到底还有没有一点人性?宋阿凡达2票房垮了?数据显示,阿凡达水之道(下称阿凡达2)内地首周末报收3。97亿,预测票房缩水至10亿。上映前,这部电影被业内看作救市良药,当时业内预测,阿凡达2票房最终有望冲击30亿元。短短几天时比伊甸园尺度更大,综艺现场公开选妃,真当自己是太子爷?最近伊甸园第二季播出,其中大尺度问题,闹得沸沸腾腾,让人直呼毁三观!纵观国内,奇葩毁三观的综艺节目早已被玩出花了。早在2016年,有这么一个恋综节目叫做黄金单身汉。25个不同类型不阿凡达2首周末票房出炉,全球破30亿,中国是最大海外票仓阿凡达2能否回本,已经成了近期全球电影市场最大的话题根据北美媒体DEADLINE的报道,阿凡达2的制作成本不是4亿美元,而是4。6亿美元,这次是实打实的影史最昂贵的大片了,不过这个欧盟新电池法达成协议,中国动力电池面临冲击撰文Sueyl编辑郭郭这是环球零碳的第459篇原创随着电动汽车的大规模发展,作为其动力来源的电池需求量与日俱增。数字制造提供商Protolabs发布的报告显示,到2030年对电池的