zoukankan      html  css  js  c++  java
  • TS学习笔记--接口

    基础类型

    //  ts 变量一开始是什么类型,后续赋值只能沿用
     (()=>{
        console.log('测试');
        // 1、布尔类型
        let flag:boolean = true
        console.log(flag);
    
        // 2、数字
        let a1: number = 10 // 十进制
        let a2: number = 0b1010  // 二进制
        let a3: number = 0o12 // 八进制
        let a4: number = 0xa // 十六进制
    
        // 3、字符串
        let name:string = 'tom'
        name = 'jack'
        // name = 12 // error
        let age:number = 12
        const info = `My name is ${name}, I am ${age} years old!`
    
        console.log('================');
        
    
        // 4、undefind类型
        // let und:undefined = undefined
        // let nul:null = null
        // console.log(nul);
        // console.log(und);
        
        // undefind 和 null 都可以作为其他类型的子类型,如赋值给number,关闭严格模式
        //  tsconfig.json 中 设置 "strict": false, 
        // let flag1:number = undefined
        // console.log(flag1);
    
        console.log('================');
    
        // 5、数组类型
        // 数组定义方式1
        // let 变量名:数据类型[] = [值1,值2...]
        let arr1:number[] = [10,20,30]
        console.log(arr1);
        
    
        // 数组定义方法2 泛型写法
        let arr2:Array<number> =  [100,200,300]
        console.log(arr2);
        
        // 注意问题:数组定义后,里面的数据类型必须和定义时候的类型一致,否则会提示错误,编译也不会通过
    
    
        // 元组类型在定义数组的时候,类型和数据的个数一开始就限定了,一一对应
        let arr3:[string,number,boolean] = ['黄',123.12345,true]
        console.log(arr3);
        // 注意类型:元组类型在使用的时候,数据的类型的位置和数据的个数 一个和定义元组的时候的数据类型及位置
        console.log(arr3[0].split(''))
        console.log(arr3[1].toFixed(2))
    
        console.log('================');
    
        // 6、枚举类型,枚举里面的值都可以称之为元素,每个元素都有自己的编号,编号从0开始,依次递增加1
    
        enum Color{
            red=1,
            green,
            blue
        }
        
        // 定义Color的枚举变量来接受枚举的值
        let color:Color = Color.red
        console.log(color);
        console.log(Color.red,Color.green,Color.blue);
        console.log(Color[3]); // 输出blue
    
        // 小例子
        enum Gender{
            // 可以写中文的数据值,但是不推荐
            女,
            男
        }
    
        console.log(Gender.男);
        console.log('================');
        
        // 7、any 任何类型
        let str:any = 100
        str = '123'
        console.log(str);
    
        // 一个数组中要存储多个数据,个数不确定,类型不确定,可以用any定义
        let arr5:any[]= [100,'123',true]
        console.log(arr5);
        // 缺点 没有报错信息
        // console.log(arr5[0].split(''));
        console.log(arr5[1].split(''));
        
        // 8 void,在函数声明的时候,在小括号的使用冒号:void,代表该函数没有任何返回值
        function showMsg():void{
            console.log('测试void');
        }
        showMsg()
        console.log('================');
    
        // 9、object类型
        // 定义一个函数,参数是object,返回值也是object类型
        function getObj(obj:object):object{
            console.log(obj);
            return {
                name:'黄',
                age:27
            }
        }
        console.log(getObj({
            name:'卡卡西'
        }));
        console.log(getObj(new String('123')));
        console.log(typeof new String('123'));
        
        // 10、联合类型(Union Types)标识取值可以为多种类型中的一种
        // 需求1:定义一个函数得到一个数字或字符串值的字符串形式值
        function getString(str:number|string):string{
            return str.toString()
        }
        console.log(getString('123'));
        
        // 需求2:定义一个函数得到一个数字或字符串值的长度
        // 类型断言:告诉编辑器,我知道我自己是什么类型,也知道自己在干什么
        // 语法1:<类型>变量名
        // 语法2:值 as 类型
    
        function getString2(str:number|string):number{
            // return str.toString().length
            // 如果str本身就是string类型,呢么是没有必要调用toString类型
            if((<string>str).length){
                return (<string>str).length
            }else{
                return str.toString().length
            }
        }
        console.log(getString2('1235'));
        console.log(getString2(123555));
    
        // 类型推断:没有明确的指定类型时候推测出来一个类型
        let txt = 100
        console.log(txt);
        
        let txt2;
        txt2 = 100
        txt2 = '123'
        console.log(txt2);
        
    
     })()    
    

    接口

    // 接口:是一种类型,是一种规范,是一种规则,是一种能力,是一种约束
    (()=>{
        console.log('123');
        // id是number类型, 必须有, 只读的
        // name是string类型, 必须有
        // age是number类型, 必须有
        // sex是string类型, 可以没有
     
        // 定义一个接口,该接口作为person对象的类型使用,限定或者是约束该对象的属性数据
        interface IPerson {
            readonly id:number // 只读 number类型
            name:string
            age:number
            sex?:string // 可有可无
        }
    
    
        // 定义一个对象,该对象的类型就是我定义接口IPerson
        const person:IPerson={
            id:1,
            name:'小甜甜',
            age:18,
            // sex:'女'
        }
    })() 
    

    函数类型

    // 为了只是使用接口表示函数类型,我们需要给接口定义一个调用签名。
    // 它就像是一个只有参数列表和返回值类型的函数定义。参数列表里的每个参数都需要名字和类型。
    (()=>{
        // 函数类型:通过接口的方式作为函数的类型来使用
    
        // 定义一个接口 原来作为某个函数的类型来使用
        interface ISearchFunc{
            // 定义一个调用签名
            (source:string,subString:string):boolean
        }
        // 定义一个函数,该函数就是上面定义的接口
        const searchString:ISearchFunc = function (source:string,subString:string):boolean{
            // 在source 字符串中 查找 subString 字符串
            return source.search(subString) > -1
        }
    
        // 调用
        console.log(searchString('first','two'));
        
    })()
    

    类类型

    // 类的类型,可以通过接口来实现
    (()=>{
        // 定义一个接口
        interface IFly{
            // 该方法没有任何的实现
            fly()
        }
    
        // 定义一个类,这个类的类型就是上面定义的接口
        class Person implements IFly{
            fly(){
                console.log('我会飞我是超人');
            }
        }
    
        const person = new Person()
        person.fly()
    
    
        // 定义一个接口
        interface ISwim{
            swim()
        }
    
        // 这个类的类型就是IFly和Swim
        class Person2 implements IFly,ISwim{
            fly(){
                console.log('我会飞'); 
            }
            swim(){
                console.log('我会走');
            }
        }
    
        const person2 = new Person2()
    
        person2.fly()
        person2.swim()
    
        // 总结:类可以通过接口的方式,定义当前这个类的类型
        // 类可以实现一个接口,类也可以实现多个接口
    
        // 接口可以继承其他多个接口
        interface IMyFlyAndSwim extends IFly,ISwim{}
        class Person3 implements IMyFlyAndSwim{
            fly(){
                console.log('我会飞3');
            } 
            swim(){
                console.log('我会走3');
            }
        }
        const person3 = new Person3()
    
        person3.fly()
        person3.swim()
    
        // 总结:接口和接口之间叫继承(关键字:extends),类和接口之间叫实现(使用的是implements)
    })()
    
  • 相关阅读:
    新版Unity的一些小玩意儿
    Three.js踩坑笔记
    Unity 接入腾讯云COS对象存储
    通过贝塞尔曲线编辑曲线
    利用ZXing.Net生成和识别二维码
    开源免费的安卓投屏工具-Scrcpy
    Unity Reflection Probe使用入门
    Unity VFX踩坑
    windows上通过自定义后缀文件启动Unity应用
    应用于Oculus Quest的VR头显应用
  • 原文地址:https://www.cnblogs.com/xujinglog/p/14611298.html
Copyright © 2011-2022 走看看