TypeScript快速过一遍

本文详细介绍了 TypeScript 和 JavaScript 中的变量、常量概念,包括 undefined、any、数组和枚举的使用,以及类型别名、循环遍历、函数、面向对象编程(类、构造器、继承、接口等)和设计模式(如单例、观察者)等核心内容。
摘要由CSDN通过智能技术生成

变量,常量

//TypeScript JavaScript
//1.类型 2.面向对象的
//输出语句
let personName = "涛涛";
document.write(personName);

//const声明的是常量
const tmp = "我是常量";

//类型限制
let personName2:string= "涛涛2";
document.write(typeof(personName2))

变量类型

undefined

//undefined:声明了一个变量,还没有赋值
let tmp:number;
document.write(tmp + "");    //undefined

any

//any代表任何值都可以存
let tmp:any = false

tmp = 2;
document.write(tmp)

tmp = "123";
document.write(tmp)

tmp = false;
document.write(tmp)

array数组

//array
//类型相同,含义相同
let a:string[] = ["1","2","3"];
//因为document.write必须打印string,所以我们要给array转string,用+来变更类型
document.write(a+"")

枚举

//枚举 自己定义一个属于自己的类型
enum Color{
    red,
    blue,
    green
}

enum State{
    idle,
    run,
    death,
    attack
}

let color:Color = Color.green;   
let state:State = State.idle;   

//使用演示
switch(state){
    case State.idle:
        console.log("站立")
        break;
    case State.run:
        console.log("奔跑")
        break;
    case State.death:
        console.log("死亡")
        break;
    case State.attack:
        console.log("攻击")
        break;
    default:
        console.log("其他状态")
}

注意script

在这里插入图片描述

细节扩展

插值语法

// +号插入
let tmp:number = 3;
document.write('这个数字是' + tmp);    //这个数字是3

// ${变量} 语法不再支持
let tmp:number = 3;
document.write('这个数字是${tmp}');    //这个数字是${tmp}

同时支持两种类型

let tmp:number|string = 3;
tmp = "测试";

typeof

let a = 2
console.log(typeof a)

类型别名

//类型别名,定义一个自己的类型别名
type NewNumber = number;
let num:NewNumber = 3;
console.log(num)    //number

循环遍历

foreach(遍历)

of

//遍历内容
let names:string[] = ["小红","小明"]
for(let tmpName of names){
	console.log(tmpName)    //小红,小明
}

in

//遍历索引
let names:string[] = ["小红","小明"]
for(let tmpName in names){
	console.log(tmpName)    //0,1
}

函数

返回值写法

//无返回值,void可以省略
function add(num:number):void{
    console.log(num)
}

let test = add(2)

匿名函数

//匿名函数
let add = function():number{
    return 1 + 2;
}

console.log(add)   

箭头函数

//箭头函数
let add2 = (num1:any,num2:any):number => {
    return num1 + num2;
}

console.log(add2)

面向对象

基础class

//定义类
class Person{
    name:string = "默认"
    age:number = 0
    
    say(){
        console.log(this.age)
    }
    
}

//实例化对象
let a = new Person();
console.log(a.name) //默认
a.say()             //0

构造器

//构造函数与java一样,默认一个无参构造器
class Person{
    name:string = "默认"
    age:number = 0
    
    //注意只能写一个构造器
    //两个参数构造器
    constructor(name:string,age:number){
        this.name = name;
        this.age = age;
    }

    say(){
        console.log(this.age)
    }
    
}

//实例化对象
let a = new Person("我",18);
console.log(a.name) //我
a.say()             //18

静态属性、方法

//静态与java一样
class Person{
    //静态属性
    static des:string = "这是一个person类"
    //静态方法
    static callPerson(){
        console.log('你使用了静态方法')
    } 

    name:string = "默认"
    age:number = 0
    
    //注意只能写一个构造器
    //两个参数构造器
    constructor(name:string,age:number){
        this.name = name;
        this.age = age;
    }

    say(){
        console.log(this.age)
    }
    
}

console.log(Person.des)     
Person.callPerson();

封装

//封装
class Person{
    private _name:string;
    
    set name(value){
        this._name = value;
    }

    get name(){
        return this._name
    }
}

let a = new Person();
a.name;

继承与抽象类

继承

super错误用法

//继承
//人类class
class Person{
    name:string = "人类"
    age:number = 0

    say(){
        console.log(this.age)
    }
    
}

//学生class
class Student extends Person{
    name:string = "学生"
    
    say0(){
        console.log(this.name)
    }

    say1(){
        console.log(super.name)
    }
}

let stu = new Student();
stu.say0()   //学生
stu.say1()   //undefined

super正确用法

//继承
//人类class
class Person{
    name:string = ""
    age:number = 0

    say(){
        console.log(this.name)
    }
    
}

//学生class
class Student extends Person{
    say(){
        super.say()
    }
}

let stu = new Student();
stu.name = "学生"
stu.say()   //学生


抽象类

//抽象类,不能被实例化,但是可以被继承
//人类class
abstract class Person{
    name:string = ""
    age:number = 0

    run(){

    }

    //这个方法子类必须实现,需要返回值
    abstract say():void;
    
}

//学生class
class Student extends Person{
    //实现父类的抽象方法
    say(){
       console.log("say hello")
    }
}

//实例化,可以这样写,但是没必要,可以看得清楚一点而已
let a:Person = new Student()
a.say();

接口

//接口就是抽象类,只不过默认属性和方法全部都是抽象的

命名空间

//a b
//两人代码冲突问题
namespace aa{
    export class Person{
        name:string = '刘';
    }
}

namespace bb{
    export class Person{
        name:string = '张';
    }
}

//尝试实例化Person
let person = new aa.Person();
let person2 = new bb.Person();

泛型

//T泛型代表任何类型
function add<T>(num:T):T{
    if(typeof num == "number"){
        num++
        return num;
    }
    return num;
}
console.log(add<number>(3) + "")   //4
console.log(add<string>("3"))   //3

元组,数组,字典

//元组
let hero:[string,number] = ["超人",100];
hero[0] = "蝙蝠侠"
console.log(hero[0])

//数组
let array1:number[] = [1,2,3]
let array2:Array<number> = new Array<number>();
//在数组后面追加元素
array1.push(4)
//在数组前面添加元素
array1.unshift(0)
//删除(取出)最后的元素
array1.pop()
//从第几位开始删除几个
array1.splice(0,1)
//删除(取出)最前面的
array1.shift();
//合并两个数组为array1
array1 = array1.concat(array2)
//查找元素位置
let index = array1.indexOf(3);  //2
console.log(index)
//排序
array1.sort();  
//翻转
array1.reverse();   

//["a","b","c"] key value 0:"a" 1:"b" 2:"c"
//字典
//就是不想用原来的索引key 0,1,2...然后自定义索引
let dic:{[key:string]:string} = {
    "name":"王小虎",
    "name2":"李逍遥"
}
dic["name3"] = "令狐冲"
console.log(dic["name3"])   //令狐冲

回调

无参

//回调函数
function func1(value:Function){
    //调用函数
    //先做一些事情后,再调用回调函数
    console.log(1 + 1)
    value();
}

func1(test)

//回调函数
function test(){
    console.log('test')
}



//调用匿名回调函数
func1(function(){
    console.log('test2')
})

//调用箭头函数回调函数
func1(() => {
    console.log('test3')
})

有参

//回调函数
function func1(value:Function){
    //调用函数
    //先做一些事情后,再调用回调函数
    console.log(1 + 1)
    value("nana");
}

func1(test)

//回调函数
function test(name:any){
    console.log(name)
}



//调用匿名回调函数
func1(function(name:any){
    console.log(name)
})

//调用箭头函数回调函数
func1((name:any) => {
    console.log(name)
})

正则表达式

let reg = /\d{4}-\d{7}/g;
let str = "0345-1234567";
let res = reg.exec(str);
console.log(res);   // ["0345-1234567"] 

res.forEach(function(value,index){
    console.log(value,index)       //"0345-1234567",  0         匹配到的内容,以及匹配到的下标
})

访问修饰符

与java一样,不再讨论

设计模式

单例模式

在这里插入图片描述

饿汉式

//单例模式
//简单模拟_饿汉式
class SoundManager{
    static Instance = new SoundManager();

    private constructor(){

    }
}
//用声音管理类
SoundManager.Instance

懒汉式

//单例模式
//简单模拟_懒汉式
class SoundManager{
    private static instance:SoundManager;
    private constructor(){

    }

    static Instance(){
        //当前单例是否产生
        //懒加载
        if(!SoundManager.instance){
            SoundManager.instance = new SoundManager();
        }
        return SoundManager.Instance;
    }
}
//用声音管理类,不管调用几次,对应的都是同一个对象
SoundManager.Instance();
SoundManager.Instance();
SoundManager.Instance();
SoundManager.Instance();

代理模式

在这里插入图片描述

interface ICalc{
    calc(num1:number,num2:number):number
}
//被委托人
class Npc1 implements ICalc{
    calc(num1:number,num2:number){
        return num1 + num2;
    }
}
//被委托人
class Npc2 implements ICalc{

    calc(num1:number,num2:number){
        return num1 - num2;
    }
}

//委托者
class Person{
    //代理
    delegate:ICalc
//
|undefined
    
    GetNum(num1:number,num2:number){
        //拿到num1和num2计算后的结果
        let num = this.delegate.calc(num1,num2)
        console.log(num + "")
    }
}

//实例化委托人
let person = new Person()
//设定一个代理
person.delegate = new Npc1()
person.GetNum(3,4)  //7

person.delegate = new Npc2()
person.GetNum(3,4)  //-1

观察者模式

在这里插入图片描述

interface IObserver{
    nameChanged(newName:any):any;
}
class Person{
    //所有的观察者
    observers:Array<IObserver> = new Array<IObserver>();

    private _name:string|undefined

    set name(value){
        this._name = value
        //发生变化
        //遍历观察者数组,给所有的观察者发消息
        for (let observe of this.observers){
            observe.nameChanged(this._name);
        }
    }

    get name(){
        return this._name;
    }
}

class Test implements IObserver{
    nameChanged(newName: string){
        console.log("监听到变化,名字变为" + newName)
    }
}

let person = new Person();
let test = new Test();
//设置为监听对象
person.observers.push(test)

person.name = "哈哈哈"

工厂模式

在这里插入图片描述

enum EnemyType{
    Boss,
    Monster,
}

class Enemy{
    name:string|undefined
    //工厂方法,用来创建对象
    static Create(enemyType:EnemyType):Enemy{
        let enemy:Enemy
        switch(enemyType){
            case EnemyType.Boss:
                enemy = new Boss();
                break;
            case EnemyType.Monster:
                enemy = new Monster();
                break;
        }
        return enemy;
    }
}

class Boss extends Enemy{}
class Monster extends Enemy{}

let boss1 = Enemy.Create(EnemyType.Boss)

链表(目前不用特别关注,目前CPU性能够高,用不上)

链表从中间删除数据比较方便,直接把next直到下一个
在这里插入图片描述
在这里插入图片描述

链表遍历

class Person{
    name:string|undefined;
    next: Person;

    constructor(name:string){  
        this.name = name;
    }
}

let person = new Person("李逍遥")
person.next = new Person("王小虎")
person.next = new Person("赵灵儿")

//删除
person.next = person.next.next;

//添加
let tmpPerson = new Person("赵四")
tmpPerson.next = person.next;
person.next = tmpPerson;

while(person){
    console.log(person.name)
    //让节点后移
    person = person.next
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼鬼骑士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值