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

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

湖勇大战!浓眉填满数据栏,纳恩100命中率,库里维金斯单节19分NBA季前赛的比赛继续进行,湖人对阵勇士的比赛打响,新赛季的比赛还没有正式开打,勇士队就遇到了大麻烦,在一次队内训练的过程中,格林与普尔发生了激烈冲突,格林一拳击倒了普尔,好在是队联盟键盘侠对S12复盘,麻辣香锅惹争议,直言大飞状态下滑今年英雄联盟世界赛S12非常精彩,中国有四支队伍进入了比赛当中,在10月8日刚刚结束的首日小组赛中,RNG和JDG都赢得了比赛的胜利,为了让大家更好的了解赛事,虎牙推出了联盟键盘侠今天!CBA新赛季常规赛正式打响,深圳VS山东,辽宁VS广厦CBA联赛2223赛季常规赛,今天终于正式打响!揭幕战有两场比赛,深圳队VS山东队,辽宁队VS广厦队,其中黄金时间段播出的辽宁与广厦的比赛CCTV5有直播。CBA第一阶段的比赛在杭对话亚信安全现代勒索攻击团伙其实就是APT组织,单纯靠数据备份治标不治本勒索软件已成为最被瞩目的安全威胁之一。全球威胁情报机构RiskIQ曾发表过统计,表示每1分钟就有6家单位遭受勒索攻击,而每分钟因网络安全导致的损失高达180万美元,整年超过6万亿人新材料产业七大发展方向我国新材料产业正处于由中低端产品自给自足向中高端产品自主研发进口替代的过渡阶段国内高端新材料技术和生产偏弱,近年来产能虽有显著提高,但还未能满足国内高端产品需求,材料强国之路任重而经常吃燕窝的人会在不知不觉中内调养好自己的状态人一到中年的时候就会逐渐的出现衰老的迹象,血zi会一直上升,然而这些飙升一般会出现在平时生活不规律的人身上。吃燕窝的人比较不容易生病,燕窝可以增强体质,调整身体的状态,迎接忙碌的工全球发展迅猛的板式网球,在中国却很难走出上海今年8月,国际奥委会公布了2028年洛杉矶奥运会9个新项目的候选名单,当国内体育界为极限飞盘未能入选而遗憾时,整个西班牙语和拉丁语地区最惋惜的,应该是板式网球(Padel)的缺席。国少输给一个人!最终出线完成任务中国2006年龄段U16国少队最终还是没有能够挡住澳大利亚队的攻势,尤其是17号伊兰昆达的个人冲击,以1比3输给了对手,未能拿到锁定决赛阶段比赛入场券所需要的1分。最终,国少队以2成都世乒赛团体赛有感成都世乒赛团体赛已完美收官。昨天中日半决赛是提前上演的冠亚军对决,男乒险胜日本挺进决赛,轻松30夺冠就显而易见了。因为这些年乒乓球团体决赛不论男女几乎都是中日对决。因2020东京奥镜报英格兰建议太太团注意衣着,有人考虑穿阿拉伯长袍直播吧10月10日讯据镜报报道,英格兰太太团已经被建议,如果随队参加卡塔尔世界杯,就必须注意着装问题,以尊重当地习俗。镜报表示,由于目前的新冠疫情依然严峻,英格兰主帅索斯盖特不排除比赛结束后,运动员都想进100的液氮急冻箱,到底有什么作用?前言不知道大家对液氮有没有一定的认识,其实在生活中,有很多人对液氮的了解并不是特别充分,只知道它温度很低。而一些有经常观看体育比赛的粉丝就一定知道液氮有什么作用,液氮最主要的就是能
给桌面和游戏体验加点料,雷柏VH800游戏耳机VH10耳机支架体验头条创作挑战赛对于头戴式游戏耳机,先不说耳机的体验效果怎么样,如果没有耳机支架的搭配,这款耳机就会少了些灵魂。不仅缺少了氛围感,随意摆放也会给桌面造成凌乱的表现。这次,我就给大家分日子不太好过,iPhone14Plus匆忙降价1500元,iPhone14降1100从现在的市场看,各大手机厂商的日子都不怎么好过,连苹果也是如此。为什么这样说呢?从去年的全球手机销量看,下滑了11左右,创下2013年以来最差的成绩。而现在只是新年初,这种低迷的手手机对现代人际关系影响越来越大在病毒肆虐的时期,科技带给人的联接就越发珍贵。但是,这会不会是一把双刃剑,同时也造成我们与最亲密人之间的关系疏离呢?智能手机带给我们源源不断的资讯和娱乐。我送给我先生一个无线耳机做电费刺客!为什么今年冬天的电费普遍都贵?每年冬天的电费都是一个谜,明明自己用的电根本不多啊,为什么电费这么贵?相信很多家庭产生同样的疑问,甚至不少地区今年的电费比去年同期贵三四倍,缴费的手都在颤抖。为什么冬天电量用得快,HTC手机依然是发展主轴预计今年二季度推出新机手机中国新闻作为智能手机的骨灰级玩家,HTC曾经在手机市场上占据主流地位。不过,近些年这家厂商的发展并不顺利,手机业务可谓一落千丈。让人感到意外的是,HTC不仅不会放弃手机业务,而对于春节没有中国游客去日本,日本网友恶评他们不来的话太好了一直以来,中国游客因为规模庞大,舍得花钱,成为了各国旅游业的香饽饽。毕竟谁能拒绝在本国旅游花钱如流水的中国人呢?所以对于中国人到各地旅游,各国的地方政府都是极为欢迎的,甚至不惜推出中国古代大工程之佛教及其建筑的发展与演变(六)崛起藏传佛教大昭寺与小昭寺示意图藏传佛教,俗称喇嘛教,始于7世纪中叶,吐蕃国王干布先后迎娶尼泊尔赤尊公主和唐朝公主,在两位公主的影响下皈依佛教,修建了大昭寺和小昭寺分别用来供奉赤尊隐藏在中国传统酷刑下的文明密码右上角关注Aka王大师傅,从此江湖同行。前一篇写过了西方一些残忍刑罚,这一次,来聊聊土生土长的中华文明。当然,这个文明是带有引号的。酷刑,属于我们文化的历史污点,所以也不妨将其称为泰州富豪刘锦兰电工出身,借力改制,成为中国钢帘线大王刘锦兰01刘锦兰,1950年2月出生在江苏省兴化市戴南镇,先是在村里种地,后来当过电工,还做过供电所主任。上世纪80年代中期,正是江苏乡镇企业蓬勃发展之际,各地乡镇企业如雨后春笋般爆卖1亿台!这个中国品牌究竟有怎样的魔力,能如此畅销?曾几何时,外媒对中国制造的评价无非是廉价和低质,就连国人都对中国制造嗤之以鼻,但如今形势变了,外媒敏锐察觉,中国制造正迎来一轮全新的爆发!美国纽约时报刊文称中国制造的商品正逐渐被全(体育)短道速滑世界杯多德雷赫特站中国队晋级男子5000米接力决赛当日,在20222023赛季国际滑联短道速滑世界杯荷兰多德雷赫特站男子5000米接力半决赛中,由林孝埈刘冠逸宋嘉华钟宇晨组成的中国队以7分09秒537的成绩晋级A组决赛。2月11日