美文网首页
TypeScripet

TypeScripet

作者: 我的钱包瘪瘪的 | 来源:发表于2018-11-28 17:07 被阅读0次

    TypeScript(微软, 趋势)为js提供了静态类型检测的能力

    1. 概念类

      • 概念: JavaScript的超集语言(兼容js语法)

      • 作用: 给js提供了类型系统和ES6的语法支持

      • 与Flow的区别: Flow是类型检查工具, TypeScript是开发语言, 有自己的编译工具, 会最终转换成js

    2. 安装使用

      官网: https://www.tslang.cn/docs/home.html

      安装TS编译器: cnpm i typescript -g

      安装完成, 提供tsc命令使用, 把ts文件转换成js文件 tsc ./index.ts

    3. TS的配置文件

      • 创建tsconfig.json配置文件, tsc --init

      • 设置常用的配置:
        target: 转化后的js是es5模式
        module: 转化后的js模块化方式
        outFile: "outDir": "./dist", 全部转化到dist文件夹下
        rootDir: "rootDir": "./src", 需要转化的是src目录下
        strict: 转化后是否严格模式

    TS的数据类型

    1. number类型
      let a: number = 10;
      let b: number = NaN;
      let c: number = infinity;
      // number还可以是八进制 十六进制
    
    1. string类型
      let str: string = 'abc';
      let str1: string = `这是模板字符串${str}`;
    
    1. boolean类型
      let flag: boolean = true;
    
    1. 数组类型
      // number型数组
      let arr: Array<number> = [1, 2];
      // number型数组
      let arr1: number[] = [1, 2, 3]
    
    1. 元组
      // 允许表示已知元素长度和类型, 两个元素, 第一个元素必须number
      let arr2: [number, string] = []
      // 越界访问时, 第三个元素既可以number也可以是string, 其他不允许
    
    1. void 空值
      // 可以表示undefined
      let res: void = undefined;
      let res1: undefined = undefined;
      let res2: null = null;
    
    1. never 类型, 用于不可能有返回值的函数
      const fn = (): never => {
        while (true) {
    
        }
      }
    
    1. 对象类型
      let obj: object = {};
      let obj1: object = [];
      let obj2: {name: string, age: number} = {name: 'tt', age: 18};
    
    1. 枚举类型(enum)
      enum ColorFool {
        red = '红色',
        yellow = '黄色'
      };
      let color: ColorFool = ColorFool.red;
    
    1. 类型断言
      // 根据length属性, 推断它就一定是number
      let str: any = 'abc';
      // let len: number = str.length;
      let len: number = (<string>str).length;
    

    TS中的类

    1. 类的实现
      class Animal {
        // 和ES6不同, TS属性必须声明类型
        type: string = '动物'
        // 声明好属性之后, 属性必须赋值, 或者在构造函数中进行初始化(上下两种)
        age: number
        constructor (age: number) {
          this.age = age;
        }
        eat () {
          console.log('动物进食')
        }
      }
    
    1. 类的继承, 跟ES6类似
      class Dog extends Animal {
        name: string
        constructor ( name: string, age: number) {
          // 必须先继承父集的属性
          super(age)
          this.name = name;
        }
        // 子集的eat方法会覆盖父集的eat方法
        eat () {
          console.log('狗狗独有的')
        }
      } 
    
    1. 类成员的访问修饰符

      • 在类成员前通过添加关键字来设置当前成员的访问权限

        • public 公开, 默认, 都允许访问
        • private 私有, 只能在当前类内部做访问
        • protected 受保护的, 只能在当前类或子类中访问
      enum Color {
        red = '红色',
        yellow = '黄色',
        green = '绿色'
      }
      class Car {
        // public可以任意访问
        public color: Color
        constructor () {
          this.color = Color.red
          // this.run()         // 可以内部访问
          // this.loadPeople()  // 可以内部访问
        }
        // 私有属性, 只能在Car类内部中使用
        private run () {
          console.log('run')
        }
        // 受保护属性, 只能类内部或者子类内部可以访问
        protected loadPeople () {
          console.log('载人')
        }
      }
      // 外部访问
      let car = new Car()
      // car.color    // public可以访问
      // car.run()    // 私有属性不可以被访问了
      // car.loadPeople() // 被保护的属性不可以被访问了
    
      // 子类访问
      class Audi extends Car {
        sayHi () {
          // console.log(this.color) // public可以访问
          // this.run()           // 私有属性不可以被访问了
          // this.loadPeople()    // 被保护的属性可以被子类访问
        }
      }
      // 子类的外部访问都可以
      let audi = new Audi()
      // audi.color   // public可以访问
      // audi.run()    // 私有属性不可以被访问了
      // audi.loadPeople()  // 被保护的属性不可以被访问了
    
    1. 类的只读属性和参数属性
      class Cat {
        // 只读属性
        readonly name: string
        // 参数属性, 加了public, 相当于省去了声明属性和构造器中初始化的过程
        constructor ( public type: string) {
          this.name = '嘟嘟'
        }
      }
      let cat = new Cat('噗噗')
      // cat.name = 'test' // 只读属性不可以被改写
    
    1. 类的存取器
      class Person {
        // 私有属性 "_" 标记
        private _name: string = ''
        // 存取器, 就是get和set函数, 对存储值做校验
        get name (): string {
          return this._name
        }
        set name (value: string) {
          this._name = value
        }
      }
      let p = new Person();
      console,log(p.name)
    

    TS中的接口, 可选属性, 只读属性

    1. 概念: 一个约定或者规范, 限制用户传入的参数, 关键字
      interface

    2. 可选属性, 此属性可传可不传

    3. 接口内部还可以只读属性, 不可以重新赋值

      // interface 关键字声明接口, '?'可选属性, 可传可不传
      interface AjaxOption {
        url?: string,
        // 只读属性
        readonly type: string,
        data?: object,
        success(data: object):void,
        // 额外的属性检查, 告诉接口可能还存在其他多个参数
        [propName: string]: any
      }
      // 创建ajax方法, 参数是定好的接口
      const ajax = (options: AjaxOption) => {}
      // 调用, 如果不按接口来就会报错
      // ajax({}) 
    
    1. 函数类型的接口
      interface SumInterFace {
        (a: number, b:number):number
      }
      // 函数
      const sum: SumInterFace = (a: number, b: number) => { return a + b }
    
    1. 类的类型接口(数据库访问层代码接口), 关键字: implements
      interface PersonInterFace {
        name: string,
        age: number,
        eat(): void
      }
      // 类实现接口, 必须使用关键字`implements`
      class XiaoMing implements PersonInterFace {
        name =  '小明'
        age = 18
        eat () {
          console.log(123)
        }
      }
      // 可用于数据库访问层的代码实现
    
    1. 接口的继承

      1. 接口继承接口, 关键词是: extends, 还有多接口继承,分隔
        interface TwoDPointInterFace {
          x: number,
          y: number
        }
        interface TimeInterFace {
          time: string
        }
        // 3D的点继承2D的点还有时间轴, 关键字extends
        interface ThreeDPointInterFace extends TwoDPointInterFace, TimeInterFace{
          z: number
        }
      
      1. 接口继承类
        // 定义类
        class Bird {
          type: string = '鸟'
          fly () {
      
          }
        }
        // 定义继承类的接口
        interface MiniBird extends Bird {
      
        }
        // 实现接口
        let flyingBird: MiniBird = {
          type: '',
          fly () {
            
          }
        }
      

    相关文章

      网友评论

          本文标题:TypeScripet

          本文链接:https://www.haomeiwen.com/subject/txzaqqtx.html