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)
})()
posted @ 2021-04-02 16:27  xujing123  阅读(87)  评论(0编辑  收藏  举报