速学TypeScript-精简划重点手册-下册

举报
芝麻粒儿 发表于 2022/01/23 18:49:28 2022/01/23
【摘要】 👉关于作者众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣 !!!专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)有什么需要欢迎私我,交流群让学习不再孤单。 👉前提非小白文,作者拥有几年编程经验,开发Andro...

👉关于作者

众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣 !!!
专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎私我,交流群让学习不再孤单

👉前提

在这里插入图片描述
非小白文,作者拥有几年编程经验,开发Android和Unity,因当下想开发小游戏学习CocosCreator需要用的TypeScript,所以需要了解下该语言知识。小空会挑重点,简单的回带过甚至不提。

适合做成手册,没事翻翻。

👉实践过程

😜元组

普通数组存储的都是相同类型的数据,而元素拥有存储不同类型的功能。当然排除基础类型里面的any数组:any[]

    //元组
    let tupleOne = [1, false, "类型可不同"];
    //push 添加元素,队列形式
    tupleOne.push("添加内容");
    tupleOne.push(2);
    //删除最后一个元素
    tupleOne.pop();

元组可以作为函数的参数,如下操作:

  let tupleOne = [1, false, "类型可不同"];
  this.methodSeven(tupleOne)
  methodSeven(tupleCan: (number | boolean | string)[]) {
    }

😜联合类型

小空也是第一次了解到联合类型,从Java和C#角度来考虑,着实有点666。那什么是联合的?说白了就是一个变量可以是字符串也可以是数字,用|帮助声明

    //联合类型
    let unionOne: string | number | boolean;
    let unionTwo: string[] | number[];
    unionOne = "联合";
    unionOne = 1;
    unionOne = false;
    this.methodSix(1);
    this.methodSix("类型");
    //联合类型也可以用在函数参数里面
    methodSix(myName: string | number | boolean) {

    }

😜命名空间

他的核心目的就是为了解决重名(命名冲突)的问题,比如两个人都叫小空,你怎么区分?你可以分开他们一班的小空,二班的小空。二班的班级要想和一班小空交流就需要一班的同意。

所以上面所述班级用namespace来声明,在类的最外层。其他地方想要访问到里面内容,则需要带有export,也就是允许外面调用获取。这点其实是模块的概念,和Java有异曲同工之妙,引用其他类的内容都需要import,不过TypeScript需要将暴露给外面的变量,函数,类等用关键字export声明。

尤其是中大型应用需要多人开发的时候,每人的开发习惯和命名规则都有些许差异,哪怕公司有了规范文档,总有概率可能重名,利用控件可以有效分开模块开发。
image.png

😜泛型

小空作为Android/Unity开发,Java和C#语言中泛型用的挺频繁,她是支持多种类型数据的类型,用起来很灵活,尤其是大型系统或者封装框架的时候。

上面小空刚知道any类型的时候就想到了和泛型很相似,本想着就这么试试,没想到数据存在不对等,并且当使用的多了,什么类型什么变量就很容易混乱,难免出错。还真是上帝为你开一扇门的同时,又为你关闭了一扇窗。
所以还是推荐泛型类型,函数定义以及调用如下:

    //泛型函数
    methodFan<T>(myName: T): T {
        return myName;
    }
    //泛型函数调用
    let fanHanShuOne = this.methodFan("不带指定泛型的");
    let fanHanShuTwo = this.methodFan<string>("带指定泛型的");

    //还可以是数组形式的泛型
    methodFanOne<T>(myName: T[]): T[] {
        return myName;
    }
    
    methodFanTwo<T>(myName: Array<T>): Array<T> {
        return myName;
    }

不是如图这样的接口哦
image.png

她是抽象方法的一个方案,将一些特征内容抽取出来,然后再让具体的类去实现,好比小时候父母挣钱,孩子花钱。

  1. 接口和接口的继承是extends,变量继承用英文符号:

  2. 变量继承建议先给初始值

interface ScriptInterfaceOne {
    myNameOne: string;
    myNumberStrOne: string[];
    //联合类型
    unionOne: string | number | boolean;
}


interface ScriptInterfaceTwo {
    myNameTwo: string;
    myNumberStrTwo: string[];
    //联合类型
    unionTwo: string | number | boolean;
}

interface ScriptInterfaceThree extends ScriptInterfaceOne, ScriptInterfaceTwo {
    myNameThree: string;
    myNumberStrThree: string[];
    //联合类型
    unionThree: string | number | boolean;
}


        //接口继承-记得给初始值
        let interOne: ScriptInterfaceOne = {myNameOne: "名字", unionOne: "联合", myNumberStrOne: ["1", "2"]};
        interOne.myNameOne = "";
        interOne.unionOne = "接口的联合";
        //接口是可以继承多个的  接口与接口的继承用关键字extends 变量继承用英文符号 :
        let interThree: ScriptInterfaceThree = {
            myNameOne: "名字", unionOne: "联合", myNumberStrOne: ["1", "2"],
            myNameTwo: "名字", unionTwo: "联合", myNumberStrTwo: ["1", "2"],
            myNameThree: "名字", unionThree: "联合", myNumberStrThree: ["1", "2"]
        };

😜类

l 类是和接口有区别,只能单个继承,即类A只能继承类B或类C,不能类B和类A同时继承,但是可以套娃继承 类B继承类C,类A再继承类B,这样类A也有C的属性。

l 类的构造函数只有一个,否则出错。

l 子类可访问父类里面的属性和重写父类方法。

l 类可以实现接口,用implenments,类的继承用extends。

l 类默认是public公有可见的,而Java和C#默认是非公有的。

l 抽象类和Java一致,关键词abstract和extends,且派生类必须实现抽象类内的方法

instanceof 运算符用于判断对象是否是指定的类型,如果是返回 true,否则返回 false。

//instanceof关键字判断变量是否是对应的类型

    let isType = lei instanceof ScriptLei;
 //正常的普通的类
class ScriptLei implements ScriptInterfaceTwo {
    private _myName: string | null = null;
    private _myAge: number | null = null;

    set myName(value: string | null) {
        this._myName = value;
    }

    set myAge(value: number | null) {
        this._myAge = value;
    }

    get myName(): string | null {
        return this._myName;
    }

    get myAge(): number | null {
        return this._myAge;
    }

    constructor() {

    }
 
    private _myNameTwo: string | null = null;
    private _myNumberStrTwo: string[] | null = null;
    private _unionTwo: string | number | boolean | null = null;

    get myNameTwo(): string | null {
        return this._myNameTwo;
    }

    set myNameTwo(value: string | null) {
        this._myNameTwo = value;
    }

    get myNumberStrTwo(): string[] | null {
        return this._myNumberStrTwo;
    }

    set myNumberStrTwo(value: string[] | null) {
        this._myNumberStrTwo = value;
    }

    get unionTwo(): string | number | boolean | null {
        return this._unionTwo;
    }

    set unionTwo(value: string | number | boolean | null) {
        this._unionTwo = value;
    }
}

     //调用类
        let lei = new ScriptLei();
        lei.myName = "我的名字";
        lei.myAge = 18;

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢欢迎点赞👍收藏🌟留言📝

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。