• TypeScript-01基础知识


    目录

    一、ts与es、js之间的关系

    二、TypeScript与JavaScript之间的区别

    三、安装TypeScript编译器

    四、执行typescript的步骤

    五、ts的数据类型

    1、类型别名

    2、接口

    接口 与 类型别名 的区别

    3、类型断言

    4、文字类型 

    不常用枚举、bigint、symbol

     六、类型缩小

    1、typeof  类型守卫

    2、真值缩小

    3、等值缩小

     4、操作符缩小

    never类型


    一、ts与es、js之间的关系

    二、TypeScript与JavaScript之间的区别

    TypeScriptJavaScript
    ts是js的超集,用于解决大型项目的代码复杂性js一种脚本语言,主要用于创建动态网页
    ts可以在编译期间发现并纠正错误js作为解释型语言,只能在运行时发现错误
    ts是强类型的,支持静态和动态类型是弱类型的,无静态类型选项
    ts最终被编译成js代码,便于浏览器理解可直接在浏览器中运行
    支持模块、泛型和接口不支持模块、泛型和接口
    支持es3、es4、es5以及es6+的功能不支持编译其他es3、es4、es5以及es6+的功能

    三、安装TypeScript编译器

    1. npm install typescript -g
    2. //或
    3. npm i typescript -g

    四、执行typescript的步骤

    1、进入要编译的ts文件目录下,在终端中输入:

    tsc filename.ts

    2、执行上述命令后会在该目录下生成一个对应的js文件,运行该文件:

    node filename.js

    3、ts中的优化编译

            3.1、解决ts与js中冲突问题:

    tsc --init  #生成配置文件

             3.2、自动编译

    tsc --watch

            3.3、发生错误的处理

    tsc –noEmitOnError filename.ts
    

     3.4、降级编译

            在tsconfig.json配置文件里,将编译的es6编程es5

    1. /* Language and Environment */
    2. "target": "es5",

     3.5、严格模式的设置(根据需求将对应的模式注解或该位false)

    1. /* Type Checking */
    2. "strict": true,
    3. "noImplicitAny": true,
    4. "strictNullChecks": true,

    五、ts的数据类型

    1. // 一、基元类型 Number String Boolean
    2. let num: Number = 1;
    3. let str: String = "hello";
    4. let bool: Boolean = true;
    5. // 二、数组
    6. let arr:Number[] = [1,2,3,4] //只用整数组成的数组
    7. let arrTy: Array<基元类型> = [];
    8. // 三、不希望在某些时候导致类型检查错误 => any
    9. let data: any; // data 可以是任何类型,这与原生的js变量一样
    10. // 四、函数 函数的参数在大多数时候还是建议带上类型注释的,这样可以防止函数的参数变为隐式的 any 类型
    11. function fn(num: Number){
    12. console.log(num)
    13. }
    14. // 五、对象类型 其中在obj中的属性 b 后面加一个 ? 表示该值可穿可不穿;其类型为 Number | undefined
    15. function obgFun(obj:{a:Number,b?:Number}){
    16. console.log("obj.a的值为",obj.a);
    17. console.log("obj.b的值为",obj.b);
    18. }
    19. obgFun({a:1})
    20. obgFun({a:1,b:2})
    21. // 六、联合类型(union) :有两个或多个其他类型组成的类型
    22. let data: Number|String; //表示变量 data 可以是一个Number 也可以是 String。后面可以继续接其他数据类型

    1、类型别名

            通过了解ts的数据类型之后,发现有时候在多次使用某种数据类型的时候(尤其是 联合类型和对象类型)就会很麻烦,这个时候可以通过关键字type将某种数据类型赋值给一个变量,这个过程就是定义类型别名。

    1. // 定义类型 别名
    2. type spot = {x: Number,y: Number}
    3. type ID= Number | String
    4. // 使用类型别名
    5. function printSpot(op: spot){
    6. console.log(op)
    7. }
    8. printSpot({
    9. x: 1,
    10. y: 6
    11. }) // 打印结果 {x: 1, y: 6}

    2、接口

            接口的作用其实跟类型别名是一样的,都是重新定义类型。

    1. // 接口的定义和使用与 类型别名 几乎差不多
    2. interface spot {
    3. x: Number,
    4. y: Number
    5. }
    6. // 使用接口
    7. function printSpot(op: spot){
    8. console.log(op)
    9. }
    10. printSpot({
    11. x: 1,
    12. y: 6
    13. }) // 打印结果 {x: 1, y: 6}

    接口 与 类型别名 的区别

            相同点:

                    两者都是用来定义数据类型的

            不同点:

                    在扩展数据类型的方式上不同<接口通过关键字 extends 去扩展数据类型,类型别名则是通过 & 去实现扩展的;接口通过重复定义实现添加,但类型别名不可以,类型别名只能通过 & 去添加>        

    Tip: 所有可以使用接口定义的类型,可以使用类型别名去定义。

    1. // 接口定义数据类型
    2. interface Person {
    3. name: String
    4. }
    5. // 接口扩展数据类型
    6. interface man extends Person{
    7. name: String,
    8. sex: String
    9. }
    10. // 接口的另一种扩展方式 => 重复定义(类型别名不可以使用这种方式)
    11. interface man {
    12. name: String
    13. }
    14. interface man {
    15. sex: String
    16. }
    17. // =======================================================
    18. // 类型别名 定义数据类型
    19. type Person = {
    20. name: String
    21. }
    22. // 类型别名 扩展数据类型
    23. interface man = Person & {
    24. name: String,
    25. sex: String
    26. }

    3、类型断言

            类型断言是指在不确定某个变量的类型时,给其指定一个确切的类型。

    1. // 使用 as 语法 或是 在变量前面添加 <具体数据类型> 来完成数据断言
    2. let canvasData = document.getElementById("canvased") as HTMLCanvasElement;
    3. // 或
    4. let canvas = <HTMLCanvasElement>document.getElementById("canvased");

    4、文字类型 

            文字类型 跟JS中的 常量 很像。就是定义完变量就不再允许变量的值被修改。

    1. // 字符串文字类型
    2. let a: "hello" = "hello" // 变量a 只能是 hello,不允许被修改,如果重新赋值会报错
    3. // 数值文字类型 这里函数的返回值只能是0 1 -1,如果返回其他值就会报错
    4. function returnNum(Numa:Number,Numb:Number): 0|1|-1{
    5. return Numa > Numb ? 1 : Numa === Numb ? 0 : -1
    6. }
    7. // 布尔文字类型
    8. let BoolA: true = true // 变量BoolA的值只能是true
    9. let BoolB: false= false // 变量BoolB的值只能是false
    10. // 文字类型的联合使用 (比较重要,文字类型使用的注意场景)
    11. function request(url: String,method: 'GET'|'POST'|'PUT'){
    12. console.log("请求的url为:",url)
    13. }
    14. let req = {
    15. url: "http://127.0.0.1:8080",
    16. method: "GET" // as 'GET'
    17. } // as const
    18. request(req.url,req.method) // 这样直接使用会报错,因为在定义req 的时候req.method被推断为字符串,与方法中的method的文字类型不一致
    19. request(req.url,req.method as "GET") //使用的时候加上类型断言

    不常用枚举、bigint、symbol

    1. // 定义枚举
    2. enum position = {
    3. top:1,
    4. bottom,
    5. left,
    6. right
    7. }
    8. console.log(position.top) // 打印 1
    9. console.log(position.bottom) // 打印 2 自动累加赋值
    10. // bigint 表示一个非常大的数值
    11. let Num: bigint = BigInt(100)
    12. // symbol 唯一的值
    13. let Fname = symbol("name");

     六、类型缩小

            类型缩小主要是将宽类型范围转换为窄类型范围,主要是应在 联合类型 的使用上面。

    1、typeof  类型守卫

            使用typeof去做数据类型的判断,从而达到类型缩小的目的(注意类型object与null的关系有时候类型为object的变量可能会隐式转换为null)

    2、真值缩小

    1. function returnData(data: String | String[] | null){
    2. // 这里如果 typeof data === 'object'判断的话,就会报错,因为 data 也可以推断为 null,但是如果使用 data && typeof data === 'object'进行判断就排除了 data 为null的情况(真值缩小)
    3. if(data && typeof data === 'object'){
    4. for(const i of data){
    5. console.log(i);
    6. }
    7. }else if(typeof data === 'string'){
    8. console.log(data);
    9. }else{
    10. // ....
    11. }
    12. }

    3、等值缩小

            利用等于 或 不等于(===、==、!==、!=)的运算符去判断数值之间的关系,从而达到类型缩小(尤其是==与!=,在某些特定的场景下,可以过滤出undefined与null)

     4、操作符缩小

            使用操作符 in instanceof去判断数据是否被包含在某个范围内是否为某一个对象的实例从而达到类型缩小的目的。

    never类型

            never类型可以分配给每个类型;但是,没有任何类型可以分配给never(除了never本身)。这意味 着你可以使用缩小并依靠 never 的出现在 switch 语句中做详尽的检查(可在判断中进行穷尽性检查)。

  • 相关阅读:
    体感互动游戏研发虚拟场景3D漫游
    衡量算法的性能-时空复杂度分析
    VUE 程序的执行过程(非常非常重要)
    免疫抑制作用的转录抑制分子
    PyTorch中实现Transformer模型
    mysql的分组group by
    单片机控制发光二极管的显示(1)
    力扣刷题61-旋转链表
    tomcat优化(生产环境) 加多实例部署
    计算机操作系统 第六章:输入输出系统(3)
  • 原文地址:https://blog.csdn.net/m0_51992766/article/details/126493876