typescript

typescript

编辑器这边的操作

  1. 全局安装 typescript
    npm/yarn/cnpm i/install/add typescript -g

  2. 编辑器 atom/vs code

    vscode :
    搜索: typescript

       typescript  Importer
    
       typescript  toolbox
    
  3. 使用typescript的语法

  4. 全局多一个管理器 tsc

什么是 TypeScript:
    **TypeScript 是 JavaScript 的一个超集,主要提供了类型系统和对 es7 的支持**,它由 Microsoft 开发,代码开源于 GitHub 上。
    官网:https://www.tslang.cn 中文   https://www.tslang.org 

​ 特点:
​ 可以在编译阶段就发现大部分错误,这总比在运行时候出错好
​ 不显式的定义类型,也能够自动做出类型推论
​ 即使 TypeScript 编译报错,也可以生成 JavaScript 文件
​ Google 开发的 Angular 就是使用 TypeScript 编写的
​ Angular 1.0 Angular.js 2010
​ Angular 2.0 Angular.ts 2016
​ Angular 2.0 第 10 个 版本 半年更新一次
​ TypeScript 拥抱了 ES6 规范,也支持部分 ES7 草案的规范
​ 缺点:
​ 有一定的学习成本,需要理解接口(Interfaces)、泛型(Generics)、类(Classes)、枚举类型(Enums)等前端工程师可能不是很熟悉的东西
​ 短期可能会增加一些开发成本,多写一些类型的定义,长期维护的项目,TypeScript 能够减少其维护成本
​ 安装:
​ npm install -g typescript
​ 编译一个 TypeScript 文件:
​ tsc hello.ts 类型不匹配时,编辑报错,但可以生成js(编辑通过),如果不希望编译通过需要配饰tsconfig.json

类型:
    原始数据类型:布尔值、数值、字符串、null、undefined、symbol、void、any
    内置对象类型:Boolean, Error, Array, Date, Math, RegExp
                  Document,HTMLElement,Event,NodeList ....  MouseEvent
    自定义类型: 类、接口、
类型定义:
    数值、字符串
    布尔值 let isDone: boolean = false;
           NewBoolean: boolean = new Boolean(1);返回对象
           null undefined 同理
    空值  let unusable: void = undefined
          function alertName(): void{}
    注意:undefined 和 null 是所有类型的子类型,可以赋值给 number 类型的变量,而 void 类型的变量不能赋值给 number 类型的变量
    任意值:any 允许被赋值为任意类型,任何操作都返回任意值,是任意类型的父类型
    类型推论
        没有明确的指定类型,依照值推断出一个类型。
    联合类型
        取值可以为多种类型中的一种,没列出的不可以
        let myFavoriteNumber: string | number;

    对象类型:依赖接口|类 来描述,不给类型可以推论

    接口定义:后续接口会单说
        interface Person {
            name: string;
            age: number;
        }
        let p:Person={name:'xx',age:11}
    注意:定义的变量比接口少了一些属性是不允许
    可选属性: age?: number;
    任意属性: [propName: string]: any; 任意值
    注意:必填属性和可选属性都必须是任意属性的子属性  
          例如:[propName: string]: string  其他属性要是string子属性
    只读属性: readonly id: number; 只能创建的时候被赋值

     数组的类型:
        变量:类型[]:
            let arr: number[] = [1, 1, 2, 3, 5];
            let arr: any[] = [1, 1, 2, 3, 5];
        Array<elemType>:  泛型 后面会单说
            let arr: Array<number> = [1, 1, 2, 3, 5];  

     函数的类型:
        一个函数有输入和输出,进行约束,需要把输入和输出都考虑到
        function sum(x: number, y: number): number {}
        注意:输入多余的(或者少于要求的)参数,是不被允许的
        函数表达式:let mySum = function (x: number, y: number): number {}
            let mySum: (x: number, y: number) => number = function (x: number, y: number): number {}
            变量:输入类型=>输出类型=function(参数){}
        可选参数:   function buildName(a: string, b?: string) {}
            注意:可选参数在后
        参数默认值:  lastName: string = 'Liu' 默认值在后
        接口中函数的定义:
            interface SearchFunc {
              (a: string, b: number): boolean;
            }
            let c: SearchFunc=function() {return true}
            c('qq',11)

    声明文件

        ts 使用第三方库时,我们需要引用它的声明文件
        ts 并不知道 $ 或 jQuery 是什么东西
        declare 关键字来定义它的类型,帮助 TypeScript 判断我们传入的参数类型对不对
            declare var jQuery: (string) => any;
            jQuery('#div1');
        类型声明放到一个单独的文件中,这就是声明文件jQuery.d.ts
            declare var jQuery: (string) => any;
        用到的文件的开头用「三斜线指令」表示引用了声明文件
        /// <reference path="./jQuery.d.ts" />  

        安装第三方声明文件
        npm install @types/jquery --save-dev

        引入第三方方声明文件
        import * as jQuery from 'jquery';
        import * as $ from 'jquery';

类:
    类(Class):定义了一件事物的抽象特点,包含它的属性和方法
    对象(Object):类的实例,通过 new 生成
    面向对象(OOP)的三大特性:封装、继承、多态
    封装(Encapsulation):将对数据的操作细节隐藏起来,只暴露对外的接口。外界调用端不需要(也不可能)知道细节,就能通过对外提供的接口来访问该对象,同时也保证了外界无法任意更改对象内部的数据

    实例属性: 定义在类内部 name = 'Jack'; | public xx:string 定义在构造器内部 | get|set 属性(){}
    
    继承(Inheritance):子类继承父类,子类除了拥有父类的所有特性外,还有一些更具体的特性
        es6:    使用 extends 关键字实现继承,子类中使用 super 关键字来调用父类的构造函数和方法
    存取器(getter & setter):用以改变属性的读取和赋值行为
        es6:    使用 get 属性(){return this._属性} 和 set 属性(val){this._属性=val} 可以改变属性的赋值和读取行为
    静态方法 | 类方法: static 方法名(){}        类名.方法()
    静态属性 | 类属性: static 定义在类内部 name = 'Jack'; ts实现了但转换到js暂不支持        调用:类名.方法()

    访问修饰符(Modifiers    ts实现):修饰符是一些关键字,用于限定成员或类型的性质。比如 public 表示公有属性或方法
         public:修饰的属性或方法是公有的,默认所有的属性和方法都是 public 的
         private 修饰的属性或方法是私有的,不能在声明它的类的外部访问
         protected 修饰的属性或方法是私有的+子类中允许访问
    类的类型 公司里面: 董事长位置: 继承制
        public name: string;
        constructor(name: string)
        sayHi(): void{}
        p1: Person = new Person

接口:
    可以用于对象的形状描述,函数的类型描述,类的行为进行抽象
    思想:实现(implements)不同类之间可以有一些共有的特性,这时候就可以把特性提取成接口(interfaces),用 implements 关键字来实现
    门是一个类,防盗门是门的子类。防盗门有一个报警器的功能,给防盗门添加一个报警方法。车类,也有报警器的功能,就可以考虑把报警器提取出来,作为一个接口,防盗门和车都去实现它

    interface Action{ 定义接口
        readonly id: number;//只读属性
        name:string;
        age?:number;可选
        [propName: string]: any;//任意属性
        eat?():string 可选方法的返回值
    }

    类实现接口:class 类 implements 接口{}
    类实现多个接口:class 类 implements 接口1,接口2{}

泛型:
     定义"变量" 时不确定类型,希望在使用时再来确定类型

     在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性

     function 函数<T,U>(length: number, value: T,arg:U): Array<T|U>  {}
     函数名后添加了 <T>,指代任意输入的类型  value: T 接收任何输入类型  Array<T>输出数组泛形

     函数<string,number>(参数) 使用的时候再指定类型

posted on 2019-12-07 23:10  是夏目呀  阅读(27)  评论(0)    收藏  举报

导航