TypeScript

unkonw只能作为任意类型的父类 不能作为任意类型的子类

一般使用

// object  表示一个js对象
let a: object
a = {}
a = function() {
}

// {} 用来指定对象中可以包含哪些属性
// 语法:{属性名:属性值,属性名:属性值}
// 在属性名后边加上? 表示属性是可选的
let b:{name:string,age?:number}
b = {name:'小明',age:12}

// [proName:string]:any 表示任意类型的属性
let c: {name:string,[proName:string]:any}
c = {name:'小红',age:12,gender:'女'}


// 设置函数结构的类型声明
// 语法 :(形参:类型,形参:类型...) => 返回值

let d :(a:number,b:number) => number;
d = function(n1:number,n2:number):number{
    return 12
}

// 数组的类型声明
// 类型[]   Array<类型>
// string[]  表示字符串数组
let e:string[]
e = ['a','c']

// number[] 表示数值数组
let f: number[]
let g:Array<number>
f=[1,2,3]


// 元组,元祖 就是固定长度的数组
// 语法:[类型,类型,类型]

let h:[string,number]
h = ['sss',123]


// enum枚举   选择限制

enum Gender{
    Male,
    Female
}

let i:{name:string,gender:Gender}
i = {
    name:'小玲',
    gender:Gender.Male  //将选择限制在一个对象中
}

// &表示同时
let j: {name:string}&{age:number}
j = {name:'孙伟',age:123}


// 类型的别名
type myType = 1 | 2 | 3 | 4 | 5;
let k: myType;
let l: myType
let m: myType

k = 1

abstract 抽象类

// 以abstract开头的类是抽象类
// 抽象类与其他类区别不大   只是不能用来创建对象
// 抽象类 就是专门用来被继承的类
// 抽象类中可以添加抽象方法

abstract class Animal{
    name:string;
    constructor(name:string){
        this.name = name
    }
    //定义一个抽象方法
    // 抽象方法使用abstract开头 没有方法体
    //抽象方法只能定义在抽象类中   子类必须对抽象方法进行重写
    abstract sayHello():void;
}

class Dog extends Animal{
    sayHello(){
        console.log('汪汪');
    }

    play(){
        console.log('玩骨头');
              
    }
}
const dog = new Dog('小黄')
console.log(dog);

interface 接口

      // 描述一个对象的类型
        type myType = {
            name: string,
            age: number
        }

        // 接口用来定义一个类结构  用来定义一个类中应该包含哪些属性和方法
        // 同时接口也可以当成类型声明去使用
        interface myInterface {
            name:string,
            age:number
        }
        interface myInterface {
            gender:string
        }

        const obj: myInterface = {
            name:'ssss',
            age:11,
            gender:'女'
        }






        
        // 接口可以在定义类的时候去限制类的结构
        // 接口中的所有属性都不能有实际的值
        // 接口只定义对象的结构  而不考虑实际值
        // 在接口中所有的方法都是抽象方法
        interface myInter{
            name:string;
            sayHello():void;
        }

        // 定义类时 可以使类去实现一个接口
        // 实现接口就是使类满足接口的要求
        class MyClass implements myInter{
            name:string;
            constructor(name:string){
                this.name = name
            }
            sayHello(){
                console.log('hello');  
            }
        }
        const name  = new MyClass("wa")

属性的封装

        //定义一个表示人的类
        class Person{
            //TS可以在属性前添加属性的修饰符
            // public修饰的属性可以在任何位置访问(修改)默认值
            // private私有属性   私有属性只能在类内部进行访问(修改)
            // 通过在类中添加方法使得私有属性可以被外部访问
            // protected 受包含的属性,只能在当前类和当前类的子类中访问  修改
            private _name:string;
            private _age:number;
            constructor(name:string,age:number){
                this._age = age
                this._name = name
            }

            // getter方法用来读取属性
            // setter方法用来设置属性
            // 它们被称为属性的存取器


            // 定义方法  用来获取name属性
            // getName(){
            //     return this._name
            // }

            // // 定义方法  用来设置name属性
            // setName(value:string){
            //     this._name = value
            // }
            // getAge(){
            //     return this._age
            // }
            // setAge(value:number){
            //     // 判断年龄是否合法
            //     if(value>0){
            //         this._age = value
            //     }
            // }
            // TS中设置getter方法的方式
            get name(){
                return this._name
            }
            set name(value){
                this._name = value
            }
            get age(){
                return this._age
            }
            set age(value){
                if(value>=0){
                    this._age = value
                }
            }
        }
        const per = new Person('小明',21)
        // 现在属性是在对象中设置的  属性可以任意的被修改
        // 属性可以任意的被修改将会导致对象中的数据变得非常不安全
        // per.setName('小红')
        // per.setAge(11)

        per.name = '小刚'
        per.age = 123





        class A{
            protected num:number;
            constructor(num:number){
                this.num = num
            }
        }

        class B extends A{
            test(){
                console.log(this.num);
            }
        }
        const b = new B(123)
        // b.num = 33




        class C{
            //可以直接将属性定义在构造函数中
            constructor(public name:string,public age:number){
            }
        }
        const c = new C('小小', 111)

泛型


// function fn(a:any):any{
//     return a
// }


// 在定义函数或是类时  如果遇到类型不明确就可以使用泛型
function fn<T>(a:T):T{
    return a
}

// 可以直接调用具有泛型的函数
let result = fn(10) //不指定类型,TS可以自动对类型进行推断

let result2 = fn<string>('hello')  //指定泛型



// 泛型可以同时指定多个
function fn2<T,K>(a:T,b:K):T{
    console.log(b);
    return a
}

fn2<number,string>(123,'hello')


interface Inter{
    length:number
}

//T extends Inter  表示泛型T必须是Inter实现类(子类)
function fn3<T extends Inter>(a:T):number{
    return a.length
}

class MyClass<T>{
    name:T;
    constructor(name:T){
        this.name = name
    }
}
const mc = new MyClass<string>('小智')

https://www.kancloud.cn/wangjiachong/vue_notes/2165553

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值