typescript实践应用

TypeScript 总览

新的改变

TypeScript 是一种由微软开发的自由和开源的编程语言,它是JavaScript的一个超集,扩展了JavaScript的语法。
TypeScript可以编译出纯净、 简洁的JavaScript代码,并且可以运行在任何浏览器上、Node.js环境中和任何支持ECMAScript 3(或更高版本)的JavaScript引擎中。
目前TypeScript 已在Nodejs 、Angualr、React、Vue这些框架中广泛应用。
TypeScript是为大型应用之开发而设计,作为一个前端工程师,TypeScript目前是必备技能

vscode配置自动编译

  1. 第一步 npm install -g typescript 全局安装 typescript
  2. 第二步 tsc --inti 生成tsconfig.json 改 “outDir”: “./js”,
  3. 第三步 任务 - 运行任务 监视tsconfig.json

typeScript中的数据类型

typescript中为了使编写的代码更规范,更有利于维护,增加了类型校验,在typescript中主要给我们提供了以下数据类型

    布尔类型(boolean)
    数字类型(number)
    字符串类型(string)
    数组类型(array)
    元组类型(tuple)  
    枚举类型(enum)
    任意类型(any)
    null 和 undefined
    void类型      
    never类型     

类型声明 案例.

// 布尔类型(boolean)
var flag: boolean = true;
flag = 123;   //错误
flag = false; //正确

// 数字类型(number)
var num: number = 123;
num = 'str';  //错误
num = 456;    //正确

// 字符串类型(string)
var str: string = 'this is ts';
str = true;    //错误
str = 'hahah'; //正确

// 数组类型(array)  ts中定义数组有两种方式
1. var arr1: number[] = [11, 22, 33];
2. var arr2: Array<number> = [11, 22, 33];

// 元组类型(tuple)  属于数组的一种
var arr: [number, string] = [123, 'this is ts'];

// 枚举类型(enum)
enum Color { bule, red = 5, 'orange', 'yellow' = 4 };
var b: Color = Color.bule,    //0
    r: Color = Color.red,     //5
    o: Color = Color.orange,  //6
    y: Color = Color.yellow;  //4

// 任意类型(any)
var num: any = 123;
    num = 'str';    //可以
    num = true;     //可以

// null 和 undefined  其他(never类型)数据类型的子类型
var num:number | null | undefined
   // num = 123;   123
   num;           //定义没有赋值就是undefined

// void类型 :typescript中的void表示没有任何类型,一般用于定义方法的时候方法没有返回值。
//表示方法没有返回任何类型
    function run():void{
        console.log('run')
    }
    run();
//表示有返回值的类型
    function run():number{
        return 123;
    }
    run();

// never类型:是其他类型 (包括 null 和 undefined)的子类型,代表从不会出现的值。
    var a:never;
    //    a=123; //错误的写法
    a=(()=>{
        throw new Error('错误');
    })()

typeScript中的函数

typeScript中的函数

3.1、函数的定义
3.2、可选参数
3.3、默认参数
3.4、剩余参数
3.5、函数重载
3.6、箭头函数  es6

ts函数 案例.

// 3.1、函数的定义
    //ts中定义函数的方法
     //函数声明法
    function Fn():string{   //返回的类型
        return 'run';
    }

    //ts中定义方法传参
    function getInfo(name:string,age:number):string{
        return `${name} -- ${age}`
    }
    console.log(getInfo('zhangsan',20));

    //没有返回值的方法
    function run():void{
        console.log('run')
    }
    run();

// 3.2-3、方法可选参数 + 默认参数
    //注意:可选参数必须配置到参数的最后面
    function getOptional(name:string,add:string='湖南',age?:number):string{
        if(age){
            return `${name} - ${add} - ${age}`
        }else{
            return `${name} - ${add}`
        }
    }
    getOptional('zhangsan')  //可行
    getOptional('zhangsan','怀化',123)  //可行

// 3.4、剩余参数 
    function sum(a:number,b:number,...result:number[]):number{
        var sum=a+b;
        for(var i=0;i<result.length;i++){
            sum+=result[i];  
        }
        return sum;
    }
    sum(1,2,3,4,5,6)

es5中的继承(扩展)

//原型链+对象冒充继承
function Person(name, age) {
    this.name = name;
    this.age = age;
    this.run = function () {
        alert(this.name + '大大')
    }
}
Person.prototype.sex = '男';
Person.prototype.work = function () {
    alert(this.name + '在工作')
}
function Web(name, age) {
    Person.call(this, name, age)
}
Web.prototype = new Person();
var W = new Web('李四', 55);
W.run()

typeScript中的类

4.1 类的定义
4.2 继承
4.3 类里面的修饰符
4.4 静态属性 静态方法
4.5 抽象类 继承 多态

ts类 案例.

//1、ts中定义类:class
class Person {
    name: string;
    constructor(name: string) {   //构造函数   实例化类的时候触发的方法
        this.name = name;
    }
    getName(): string {
        return this.name;
    }
    setName(name: string): void {
        this.name = name;
    }
}
var p = new Person('张三');
p.getName()    //张三
p.setName('李四')
p.getName()    //李四

//2、ts中实现继承  extends、 super
class Person2 {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    run(): string {
        return `我是${this.name}`;
    }
}
//ts中继承的探讨  父类的方法和子类的方法一致  
//在子类中 会先考虑子类的方法
class Web extends Person2 {
    constructor(name: string) {
        /*初始化父类的构造函数*/
        super(name);      //super 的作用就是改变父属性的值 Person.name
    }
}
var w = new Web('王二');
w.run()    //我是王二

// 3 类里面的修饰符  typescript里面定义属性的时候给我们提供了 三种修饰符
/*
    public :公有          在当前类里面、 子类  、类外面都可以访问
    protected:保护类型    在当前类里面、子类里面可以访问 ,在类外部没法访问
    private :私有         在当前类里面可以访问,子类、类外部都没法访问
    属性如果不加修饰符 默认就是 公有 (public)
*/

class Person3{
    //public :公有          在类里面、 子类  、类外面都可以访问
    //类外部访问公有属性
    public name:string; /*公有属性  子类可继承并使用*/
    //protected:保护类型    在类里面、子类里面可以访问 ,在类外部没法访问
    protected name2:string;  /*保护类型*/
    // private :私有        在类里面可以访问,子类、类外部都没法访问
    private name3:string;  /*私有*/

    constructor(name:string,name2:string,name3:string){
        this.name = name;
        this.name2 = name2;
        this.name3 = name3;
    }
    run():string{
        return `${this.name}在运动`;
    }
}

// 4 静态属性 静态方法
class Per {
    public name: string;
    public age: number = 20;
    //静态属性
    static sex = '男';
    constructor(name: string) {
        this.name = name;
    }
    run() {   /**实例方法 */
        console.log(`${this.name}在吃饭`)
    }
    work() {
        console.log(`${this.name}在工作`)
    }
    static pring() { /**静态方法 里面没法直接调用类里面的属性*/
        console.log(`print方法` + Per.sex)
    }
}

var p = new Per('张三');
p.run();     //张三在吃饭
Per.pring()  //print方法男  可Per 直接使用

// 5 多态:父类定义一个方法不去实现,让继承它的子类去实现  每一个子类有不同的表现 
//多态属于继承
class Animal {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    eat(){   //具体吃什么   继承他的类去实现 ,每一个子类的表现不一样
        console.log('吃的方法')
    }
}
class Dog extends Animal{
    constructor(name:string){
        super(name);   //使用super 去改变父类的属性
    }
    eat(){
        return this.name +'狗粮'
    }
}
class Cat extends Animal{
    constructor(name:string){
        super(name);   //使用super 去改变父类的属性
    }
    eat(){
        return this.name +'小鱼'
    }
}
var C = new Cat('汤姆');
var D = new Dog('烧饵块');
console.log(C.eat(),D.eat())  //汤姆小鱼 烧饵块狗粮

typeScript中的接口

接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用。接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可以满足实际需要。 typescrip中的接口类似于java,同时还增加了更灵活的接口类型,包括属性、函数、可索引和类等。

5.1 属性类接口
5.2 函数类型接口
5.3 可索引接口
5.4 类类型接口
5.5 接口扩展

ts的接口 案例.

// 1、属性接口     对json的约束
    //ts中定义方法
    function printLabel():void {
        console.log('printLabel');
    }
    printLabel();
    //ts中定义方法传入参数
    function printLabel(label:string):void {
        console.log('printLabel');
    }
    printLabel('hahah');
    //ts中自定义方法传入参数,对json进行约束
    function printLabel(labelInfo:{label:string}):void {
        console.log('printLabel');
    }
    printLabel('hahah'); //错误写法
    printLabel({name:'张三'});  //错误的写法
    printLabel({label:'张三'});  //正确的写法

//对批量方法传入参数进行约束。
// 2 接口:行为和动作的规范,对批量方法进行约束
    //就是传入对象的约束    属性接口
    interface FullName {
        firstName: string;   //注意;结束
        secondName: string;
    }
    function printName(name: FullName) {
        // 必须传入对象  firstName  secondName
        console.log(name.firstName + '--' + name.secondName);
    }
    // printName('1213');  //错误
    var obj = {   /*传入的参数必须包含 firstName  secondName*/
        age: 20,
        firstName: '张',
        secondName: '三'
    };
    printName(obj)

// 3 接口 :可选属性
    interface FullName{
        firstName:string;
        secondName:string;
    }
    function getName(name:FullName){
        console.log(name)
    }
    //参数的顺序可以不一样
    getName({        
        secondName:'secondName',
        firstName:'firstName'
    })
// 4 类类型接口:对类的约束  和   抽象类抽象有点相似    
    interface Animal{
        name:string;
        eat(str:string):void;
    }
    class Cat implements Animal{
        name:string;
        constructor(name:string){
            this.name=name;
        }
        eat(food:string){
            console.log(this.name+'吃'+food);
        }
    }
    var c=new Cat('小花');
    c.eat('老鼠');

typeScript中的泛型

6.1 泛型的定义
6.2 泛型函数
6.3 泛型类
6.4 泛型接口

泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。

在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。

通俗理解:泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持(类型校验)

//同时返回 string类型 和number类型       any可以解决这个问题
     function getData(value:any):any{
        return '哈哈哈';
    }
    getData(123);
    getData('str');
//any放弃了类型检查,传入什么 返回什么。比如:传入number 类型必须返回number类型  传入 string类型必须返回string类型
    //传入的参数类型和返回的参数类型可以不一致
    function getData(value:any):any{
        return '哈哈哈';
    }
// 泛型:可以支持不特定的数据类型   要求:传入的参数和返回的参数一直
// T表示泛型,具体什么类型是调用这个方法的时候决定的
    function getData<T>(value:T):T{
        return value;
    }
    getData<number>(123);
    getData<string>('1214231');
    getData<number>('2112');       /*错误的写法*/  
    
// 泛型类:比如有个最小堆算法,需要同时支持返回数字和字符串 a  -  z两种类型。  通过类的泛型来实现
	//类的泛型
	class MinClas<T>{
	    public list:T[]=[];
	    add(value:T):void{
	        this.list.push(value);
	    }
	    min():T{        
	        var minNum=this.list[0];
	        for(var i=0;i<this.list.length;i++){
	            if(minNum>this.list[i]){
	                minNum=this.list[i];
	            }
	        }
	        return minNum;
	    }
	}
	var m1=new MinClas<number>();   /*实例化类 并且制定了类的T代表的类型是number*/
	m1.add(11);
	m1.add(3);
	m1.add(2);
	alert(m1.min())
	var m2=new MinClas<string>();   /*实例化类 并且制定了类的T代表的类型是string*/
	m2.add('c');
	m2.add('a');
	m2.add('v');
	alert(m2.min())

//1、泛型接口
    interface ConfigFn{
        <T>(value:T):T;
    }
    var getData:ConfigFn=function<T>(value:T):T{
        return value;
    }
    getData<string>('张三');
    getData<string>(1243);  //错误

//2、泛型接口
    interface ConfigFn<T>{
        (value:T):T;
    }
    function getData<T>(value:T):T{
        return value;
    }
    var myGetData:ConfigFn<string>=getData;     
    myGetData('20');  /*正确*/
    myGetData(20)  //错误

PS:文章部分内容由于使用性少的可怜就没写入、以上代码复制即可用

参考文档

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值