ts的对象接口

49 阅读3分钟

1、普通的对象接口

        interface IObj{

            a:number;//可以以分号或者逗号结束

            b:number;

        }

        var obj:IObj={a:1,b:2};




        2、可选属性对象接口

        interface IObj{

            a:number;

            b?:number;//可选属性

        }




        var  obj:IObj={a:1,b:2};



        function fn(a:number,b:number){

            console.log(a,b);

        }

        fn(obj.a,obj.b as number);


        3、只读属性 ,无法修改会报错

        interface IObj{

            a:number;

            readonly b:number;

            // readonly b?:number; //不建议将只读属性设为可选属性

        }




        var o:IObj={a:1,b:2};

        o.a=10;

        o.b=20;//报错




      4、对象的方法

        interface IObj{

            a:number;

            // 对象的方法接口

            play:(a:number)=>void;

        }

        interface IObj{

            a:number;

            // 对象方法只读不能修改

            readonly play:(a:number)=>void;

        }

        var o:IObj={

            a:1,

            play(a){

                console.log("a")

            }  

        }

5、对象的键

        1)、普通的键值

        interface IObj{

            [key:string]:number|string;

        }




        var o:IObj={};

        o.a=10;

        o.b=20;

        o.c="a";

        2)只读键名

        可以在对象初始化的时候设置对象,之后这个对象,不能添加新属性,不能删除属性,不能修改
        属性值

        interface IObj{

            readonly [key:string]:number;

        }

        var o:IObj={a:1,b:2};

        o.c=20 //添加新属性报错




        3)可选属性

        interface IObj{

            // 使用key键时不能用可选属性

            [key:string]?:number;

        }




        4)混合属性

        interface IObj{

            a:number;//要求了对象必须至少有一个属性a,这个属性的值类型必须符合value对应的类
            型

            [key:string]:number;

        }

        var o:IObj={a:1};





        interface IObj{

            readonly a:number;//当只读属性和key属性混合时,考虑只读属性不能修改不能删除

            [key:string]:number;

        }

        var o:IObj={a:1,b:2};

        delete o.b;

        delete o.a;

        o.a=10;




        interface IObj{

            a?:number;//错误的 在key属性时,不能使用可选属性

            [key:string]:number;

        }




      6、对象的复合型接口

       interface IObj{

            name:string;

            age:number;

            sex:string;

            children?:Array<IObj>

        }




        var obj:IObj={

            name:"xietian",

            age:30,

            sex:"男",

            children:[

                {name:"aa",age:10,sex:"男",children:[{name:"abc",age:2,sex:"男"}]},

                {name:"bb",age:12,sex:"女"},

                {name:"cc",age:15,sex:"男"},

            ]

        }





        interface IO1{

            g:number;

            h:number;

        }

        interface IO2{

            d:number;

            e:number;

            f:IO1

        }

        interface IO3{

            a:number;

            b:number;

            c:IO2

        }

        var obj:IO3={

            a:1,

            b:2,

            c:{

                d:3,

                e:4,

                f:{

                    g:5,

                    h:6

                }

            }

        }




        interface IObj{

            a:number;

            b:number;

            c:{

                d:number;

                e:number;

                f:{

                    g:number;

                    h:number

                }

            }

        }

        var obj:IObj={

            a:1,

            b:2,

            c:{

                d:3,

                e:4,

                f:{

                    g:5,

                    h:6

                }

            }

        }





        interface IObj{

           [key:string]:number|IObj;

        }

        var obj:IObj={

            a:1,

            b:2,

            c:{

                d:3,

                e:4,

                f:{

                    g:5,

                    h:6

                }

            }

        }




        function fn(a:number){

        }

        fn(obj.a)

        console.log((obj.c as IObj).d)



        7、对象的索引属性和Symbol属性

        当前对象的属性仅为数值索引

        interface IObj{

            [index:number]:string|number;

            // symbol 小写是类型

            [key:symbol]:string|number;

        }

        var o:IObj={

            1:10,

            2:20,

            // 大写Symbol创建Symbol

            [Symbol("a")]:10

        }


        8、或者类型 |

        interface IO1{

            a:number;

            b:number;

        }

        interface IO2{

            c:string;

            d:string;

        }

        var o:IO1|IO2={a:1,b:2}

        o.a=10;

        o={c:"a",d:"b"}

        修改单独属性是不可以的

        var o1:IO2=<IO2>o;

        o1.c="a";

        o1.d="d"




        9、联合类型  &

        interface IO1{

            a:number;

            b:number;

        }

        interface IO2{

            c:number;

            d:number;

        }



        var o:IO1={a:1,b:2};

        var o1:IO2={c:3,d:4};



        var o2:IO1&IO2={a:1,b:2,c:3,d:4}

        function fn(o1:IO1,o2:IO2):IO1&IO2

        {

            var o:IO1&IO2=<IO1&IO2>{};

            Object.assign(o,o1,o2);

            return o;

        }


        10、keyof 键的归属(属性名)

        interface IObj{

            a:number;

            b:number;

        }


        var o:IObj={a:1,b:2};

        var key:keyof IObj="a";//keyof 对象接口 这个变量是这个对象接口中的键名

        key="b";

        key="c";// 出错,属性名设置必须对象接口中的

        console.log(o[key])

   10.1  var key:keyof IObj;表示key的值必须是IObj接口的属性名

        for(key in o){

            console.log(o[key]);

        }




        枚举不能使用keyof

        const enum CLOLR{RED="red",BLUE="blue",GREEN="GREEN"};

        var key:keyof CLOLR="red";

        for(key in CLOLR){

            console.log(key)

        }



        ReadOnly类型

        只读数组,数组方法中提出了修改原数组的方法,这个数组的元素不能修改,不能删除,不能添
        加

        var arr:ReadonlyArray<number>=[1,2,3,4,5];

        console.log(arr[0]);

        arr.push(1)

        arr.splice(2,1)


        只读Set,不能添加删除元素

        var s:ReadonlySet<number>=new Set([2,3,5,6,7]);


        只读的Map

        var m:ReadonlyMap<string,number>=new Map([["a",1],["b",2]]);


        for(var [key,value] of m){

            console.log(key,value);

        }