zoukankan      html  css  js  c++  java
  • typescript入门

    为何要使用 typeScript?

    • 我们定义一个函数,仅仅只是操作字符串,但是人总会疏忽,在js中传递进去对象,函数也一样能运行
    • 由此,我们需要一个在运行前帮我们检查,并约束数据类型的语法
    • 在 angular里面1更名为 angular,2以上都称之为 angularlO

    快速起步

    • 安装编译 TypeScript语法到s语法的编译工具

      npm install -g typescript
      

      编写代码

      function greeter(person: string) {
      return "He11o," + person;
      }
      let user = "Jane User";
      document.body.innerHTML = greeter(user);
      
    • 编译代码

      tsc greeter.ts
      
    • 可以编译的文件后缀.ts || .tsx || .d.ts

    常见错误处理

    类型

    1. 布尔值

    2. 数字

    let decLiteral: number = 6;
    

    3. 字符串

    let name: string = "bob" ;
    

    数组

    let list: number[] = [1, 2,3];
    

    任意类型数组

    let arr : any[] = ['a' ,1, true];
    

    枚举

    enum Color {Red, Green, Blue}
    let C: Color = color. Green; //1
    let msg :string = co1or[1]; // Green
    

    void

    • 一般是作为函数没有返回值的表示, 而不作为变量类型的声明
    • 因为它表示没有任何类型
    function warnUser(): void {
      	alert("This is my warning message") ;	
    }
    

    Null和Undefined

    
    

    类型断言

    类型断言有两种形式。其- 是"尖括号语法:

    let somevalue: any = "this is a string" ;
    
    let str: string = <stri ng>someValue;
    

    另一个为 as 语法:

    let someValue: any = "this is a string";
    let str: string = someValue as string;
    

    基本使用(里面不要放let/const这些)

    class Greeter{
        greeting: string;
        constructor(message: string) {
            this greeting= message;
        }
        greet() {
        		return"Hello,"+ this greeting;
        }
    }
    let greeter new Greeter("world")
    

    继承语句

    class student extends Person {}
    new Student();
    

    公共、私有、受保护修饰符

    访问修饰符与继承无关,只要符合继承规则都能访问public属性可以在任意代码范围访问class外其他class,目前可以理解到继承的class

    private只能在自己的class中访问

    protected可以在自己和子类中被访问

    公共(默认和不写一样)

    • public代表可以在class{} 以外的地方访问
    class Anima 1 {
    		pub1ic name: string =' abc' ;
    }
    new Animal().name; //可以访问
    

    privated

    class Anima1 {
        private name : string = 'Cat' ;
        public show() {
        	console.1og( ${this.name}' ); //只能在class内访问
    		}
    }
    new Animal().show(); //ok
    new Animal().name; //wrong:'name' is privated
    

    protected

    class Anima1 {
    	protected name : string = '动物';
      pub1ic age : number = 18;
    }
    class Dog extends Animal {
    	pub1ic showName() {
    		console.log(this.name); //只有在儿子里面才能访问}
    	}
    }
    let dog = =new Dog() ;
    console. log(dog. age); //公有可以访问
    console.1og(dog. name); //错误,只有在儿子里面才能访问dog.showName() ;
    

    readonly

    • 类似于之前我们使用的const,只能被赋值一次, 不能再被赋值
    class octopus {
    		public readonly name: string = 'abc';
    }
    let dad = new octopus();
    dad.name = "Man with the 3-piece suit"; //错误! name是只读的.
    

    get/set存取器

    • Accessors are only available when targeting ECMASCript 5 and hi gher

      因为默认使用的是ES3的代码规范编译,可以提高ES代码规范的版本

      tsc -t ES5 test.ts
      
    • 可以运行

    class Xxx {
        private _age: number;
        get age(): number {
        		return this._age;
        }
        set age(newAge: number) {
            if (newAge > 0 && newAge < 100) {
                this._age = newAge;
            } else {
                console. log("非法年龄");}
            }
        }
    }
    let Xxx = new xxx();
    Xxx.age = 12;
    

    静态属性

    • 使用类名,属性名访问
    • 类似构造函数的属性 function P(){}; P.xxx= ‘123’。
    • 静态属性不是实例的属性 function P(){}; p.prototye.xxx= ‘123’
    • 组合写法
    class xxo {
    		public static readonly name :string = '123';
    }
    Xxx. name
    

    小结: public/ readonly这类修饰符是在编译过程中对代码的约束,而不能管到编译后约束;静态不能访问实例,实例可以访问静态

    抽象类
    • 每个class的属性定义都很随意。可以通过抽象类来管理其必备那些属性及方法

    • 抽象类中可以有抽象方法(给子类实现) ,也可以有已实现的方法

      abstract class Animal {
          abstract makeSound(): void;
          move(): void {
            console. log(' roaming the earch...');
          }
      }
      
      • 第2行:子类必须实现,或者子类也是抽象类并声明该方法为抽象方法接口(约定、规范)
      • 只定义,不实现的抽象类
      • 接而可以用来实现,而不是继承,所以对应类必须实现接口中的方法和属性

    类实现接口

    • -个类只能继承-一个类(单继承),一个类可以实现多个接口,都是定义规则
    interface ClockInterface {
    		currentTime: Date;	
    }
    class Clock implements ClockInterface {
    		currentTime: Date ;
    		constructor(h: number, m: number) { }
    }
    

    接口继承接口

    interface Shape {
    		color: string;
    }
    interface Square extends shape {
      	IsideLength: number;
    }
    class Xxx imp1ements Square {
      	sideLength: number;
    		color: string;
    }
    
    • 最上层定义接口(规范/约定)
      • 第二层,当前实现了-部分,有一部分只能更具象的层来实现抽象类
      • 第三层,普通类,自己统一实现

    泛型

    定义类和函数时,我自己都不知道什么类型,由使用者决定

    泛型方法

    function identity<T>(arg: T): T {
    		return arg;
    }
    1et output = identity<string> ("myString");
    

    泛型类

    class Test<T,S> {
    		public xxx:T; // T改为any这个xxx- 辈子都可以是任意类型
      	add:(x:S) => s;
    }
    let test = new Test<number,string>() ;
    test.xxx = 123;
    
    • num:Person这样的自定义类型
    • T就可以传递Person
    • any是任意的数据类型,这个函数或者这个类中使用的变量类型是永远任意
      • 使用泛型后,代表留空,使用的时候填入,这个类和函数中,使用的变量类型永远是填入的
      • any是任意的,泛型是这次填入的挂钩-次
  • 相关阅读:
    selenium基础(鼠标和键盘事件)
    Java:面向对象三大特征
    Java:面向对象(上)
    Java:数组
    Java:方法
    Java基础:程序结构控制
    Java基础:用户交互Scanner
    Java基础语法(下)
    Jenkins(Extended E-mail Notification)邮箱配置正确但是并没有发送邮件
    接口自动化测试与Jenkins集成(Freestyle project任务版)
  • 原文地址:https://www.cnblogs.com/daozhangblog/p/12446328.html
Copyright © 2011-2022 走看看