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

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 的语法也不复杂,却可以实现很多复杂逻辑一样。
  后面我们会大量用到这些类型编程语法来实现各种复杂的类型逻辑。

去外地上大学是一种怎样的体验?在异地上大学有什么体会?简单阐述一下各方面的体会。好的体会方面终于可以自由了,除了学习课间外,时间都是自己的。与舍友一起逛街,一起运动。偶尔小聚吃点特色美食,增加一下同学间气氛。时怎么看待武汉学院的一本专业,值得上吗?存在即合理,武汉学院这所特色民办大学中的一本专业确实吸引了部分考生,值不值得上需要考生自己权衡吧。以下我介绍一下武汉学院及其一本专业情况,给大家一个参考。武汉学院是一所特色民办大学潍坊市区有哪些比较好的小学?上这些学校需要什么条件?潍坊市区有哪些比较好的小学?一个好的小学非常重要,可以让孩子不输在起跑线上。那么潍坊市的小学排名榜是怎么样的呢?2018年潍坊市最好的小学排名榜单公布了吗?想让孩子在潍坊市上小学,一个男人一套衣服穿十年都不舍得丢,这样的男人有出息吗?谢谢邀请,一个男人一套衣服穿十年都不舍得丟,这样的男人有出息吗?一个男一套衣服穿几年与有没有出息有关系吗?难到一个男人每年都换新衣服就有出息了?就成为科学家了,也许这样的男人更没有人物关系最乱的电视剧是哪一部?盗墓笔记人物关系我只看过一点点原著,但是影视作品都看了,基于对盗墓笔记的了解,我整理了一幅图我这只整理了我知道的,我只看过影视,复杂的我很怀疑人生,但是不得不说,我还是看过一点原著潜伏中余则成先后与三个女人有暧昧关系,这是出于职业需要吗?你怎么看?潜伏这部电视剧中的余则成时刻处于在危险之中,凭着自己的智慧在敌人内部顽强拼搏着,可仔细分析他余则成不是一个人在战斗,除了他需要的必要组织配合外,还有三个不同出身的女人陪找他,一位为在旅行途中,如何处理衣服换洗的问题?我是一名职业旅游达人,常年在外旅游不回家,最多的时候连续几个月都在路上。对于换洗衣服这个话题,我在路上时间久不一定能够说服什么,但我从东北到泰国,一路上历经59度温差,随身携带的衣出国留学去英国,读一个世界200左右的学校有必要吗?根据2020QS世界排名,英国大学一共有28所排名TOP200名之内。在140200这个区间(也就是最接近问题的TOP200名)的学校是纽卡斯尔大学(146),约克大学(148),dnf佣兵改版后,你带回最好的东西是什么?什么,佣兵会给你带回来好东西的吗?佣兵不都是给我们带回几个石头的吗?难道我的佣兵都是假的?好了,佣兵改版后我们可以分别出战能源中心异次元裂缝时空之门月轮山地轨中心以及安图恩,每个区公司有位女同事因得罪关系户,被同事们排挤,让老板误会,将要被辞退,我应该帮她吗?这个见仁见智,如果是我,我一定救。见死不救不是我的性格,更何况女同事是因为冤枉。小时候,农村没闭路电视,没什么好看的电视,记得最清楚的就是每天晚上7。30以后,央视2套播的包青天,厂里长期12小时两班转,员工下夜班后在宿舍睡觉就没醒过来,厂里有责任吗?没责任。如果员工在路上去世,厂里有责任。在宿舍都睡了,这就没有责任了。我的同事蒙旺生就是下夜班后躺在床上死了。最后各方商议,定的是因病意外死亡,厂里没有直接责任。最后把他火化了事了
俗语丧在屋,能有福双在屋,天天哭啥意思?真的有道理吗导读俗语丧在屋,能有福双在屋,天天哭啥意思?真的有道理吗中华文化博大精深,俗语文化在悠悠历史长河中更是绚丽多彩,往往因为通俗易懂深受很多的人的喜爱,这些俗语在我们的日常生活中也是非这回美元加息可能会被反割肉我的观点是三年内,美元的国际储备地位大动摇,规模大量减少,对于美元的泛滥,真是天下苦秦久矣!这几年就是割美元的绝好时机!美国用美元加息收割世界这点招数,各个国家早已经分析透彻了,破泪水为什么流下来不是知道无法拒绝,也已经学会了权衡利弊,举步维艰四顾茫然孤掌难鸣的日子,独自抵抗凄风冷雨痛到无法呼吸的时候,被这世界狠狠教训决绝抛弃求助无门的时候,不是一遍遍反思自责悔恨。或许,上夜摊经济火了,有人一晚赚了3千多块!你有摆摊经历吗?盛夏的夜晚,吹着凉风,约上三五知己好友到江边,来上一杯冰凉的饮品,这是最近很多惠州人的生活。伴随着这样的生活,夜摊经济开始频频出现在惠州人的视线里,它是疫情之下大众社交与生活方式的特效药获批上市,经济是否迎来拐点?投资机会1相关部门回应佩洛西拟窜访台湾中国绝不会坐视不管点评我国将挫败任何外部势力干涉和分裂国土,受事件消息的刺激叠加下半年经济的复苏,军工板块或存在中长期机会。2沈洪兵任中国疾控上海紫丹印务无证生产被罚没117万为紫江企业子公司来源中国经济网近日,上海市市场监督管理局网站公布的行政处罚决定书(沪市监总处2022322020000417号)显示,上海紫丹印务有限公司未取得生产许可证而擅自生产列入目录产品,被2019年,96岁赴台老兵梦想落叶归根,湖南侄子愿给伯父养老送终1987年,湖南省常宁市罗桥镇大枫树村的一位老妪已经病入膏肓,老妪自知不久于人世,临终前特别叮嘱小儿子你哥回来了,你一定要到我坟前告诉我小儿子早已泪流满面连连点头妈,您就放心吧。此疯狂1V3人球分过风骚外脚背!登贝莱梦幻表演,1人打爆尤文防线北京时间7月27日早上,巴萨跟尤文进行一场热身赛,登贝莱在上半场打出满分表现,帮助巴萨取得21领先。第33分钟,登贝莱在右路1V3过人后小角度爆射远角得手,巴萨取得10领先。桑德罗上节目疯狂炫富后被盗走2亿,三年后才悬金千万抓贼?前阵子林青霞豪宅失火,哐哐哐跑出18个佣人,让吃瓜群众大开眼界。有钱人的生活,总是这么多姿多彩,且神秘。关于有钱人为什么需要这么多佣人,2017年的真人纪录片TamarasWorl海马斯火箭弹打击俄军疯狂拦截,多枚火箭弹命中目标近日乌军又获得了西方国家援助的海马斯火箭弹,乌军发动反攻12枚火箭弹射向赫尔松州,横跨第聂伯河大桥,俄军防控导弹疯狂拦截摧毁4枚火箭弹。其余拦截失败,大概有8枚火箭弹命中大桥大桥被漫画他究竟还爱不爱你,看看卫生间就知道了?再相爱的二人,一旦步入婚姻后,将面对前所未有的挑战,这些是生活琐事及现实问题。很多人说,代表爱情的不是一日三餐四季,而是卫生间马桶。我有一女性朋友,平时很爱干净,处理问题事无巨细。