TypeScript

TypeScript

什么是TypeScript

TypeScript就是所谓JavaScript的超集,TypeScript允许程序员在其代码中使用面向对象的构造,然后将其转化为JavaScript

TypeScript的好处

  • 静态类型,typescript代码比JavaScript代码更易于预测和更易于调试
  • 面向对象的功能(模块和命名空间)使组织大型代码库更易于管理
  • 编译步骤在达到运行时之前捕获错误
  • 流行框架angular是用typescript编写的
  • typescript类似于coffeescript,另一种编译为javascript的语言,不过由于静态类型,前者比后者更加灵活

1. 安装和设置

npm install typescript -g
tsc helloword.ts

2. 编译为javascript(vscode)

  1. tsc --init生成一个tsconfig.json文件
  2. 修改文件 "outDir": "./js"
  3. 点击任务
  4. 运行任务,选择监视tsconfig

3. TS中的数据类型(11)

  1. 布尔(boolean)
  2. 字符串(string)
  3. 数值(number)
  4. undefined
    var num:number|undeined
    
  5. null
  6. 数组(Array): 两种定义方法
    var arr:number[] = [1, 2, 3]
    
    var arr:Array<number> = [1, 2, 3]
    
  7. 任意(any)
  8. 枚举(enum): 用一定的单词代表某些信息
    enum Flag {
        success= 1,
        error= 2
    }
    var flag:Flag = Flag.success
    console.log(flag)    //1
    
    enum Flag {
        success,
        error
    }
    var flag:Flag = Flag.success
    console.log(flag)    //0  当没有给类型中的变量名赋值时,它的值为下标,如果改变了其中的数值,之后的数值会累加下去
    
  9. void: 定义方法时该方法没有返回值
    function getInfo():void{
        ...
    }
    
  10. 元组类型(tuple):属于数组的一种
    var arr:[number, string] = [1, 'a']  //正确
    var arr:[number, string] = ['a', 2]  //错误
    
  11. never: 1.从不会出现的值 2. undefined和null属于never中的一种

4. TypeScript中的函数

  1. 定义
    function getInfo():number{
        return 123
    }
    
    var getInfo = function():number{
        return 123
    }
    
  2. 方法可选参数(表示参数可传可不传)

    可选参数一定要配置到参数的最后面

    function getInfo(num:number, num1?:number):number{
        if(num1){
            return num + num1
        }else{
            return num
        }
    }
    alert(getInfo(1))
    
  3. 默认参数
    function getInfo(num:number=11):number{
        return num
    }
    
  4. 剩余参数
    function getInfo(...rest:number[]):number{
        var num:number = 0
        for(var i:number = 0 ; i < rest.length ; i++){
            num += rest[i]
        }
        return num
    }
    getInfo(1, 2, 3, 4)  //10
    getInfo()            //0
    
  5. 函数重载(通过传入不同的参数实现不同的功能)
    function getInfo(name:string):string
    function getInfo(name:string, age:number):string
    function getInfo(name:any, age?:any):string{
        if(age){
            return `我的名字是${name},我的年龄是${age}`
        }
        return `我的名字是${name}`
    }
    
  6. 箭头函数

3. 静态打字

4. 数组

5. 接口

  1. 属性类接口
    interface FullName{
        firstName:string;
        secondName?:string;  //可选属性
    }
    function getInfo(info:FullName):void{
        console.log(info.firstName + '--' + info.secondName)
    }
    
    getInfo({
        firstName: 'ou',
        secondName: 'chi'
    })
    
  2. 函数类型接口
    interface entry {
        (key:string, value:string):string
    }
    var md5:entry = function(key:string,value:string):string{
        return `key:${key}--value:${value}`
    }
    
  3. 可索引接口(对象,数组的约束)(不常用)
    interface UserArr {
        [index:number]: string
    }
    
  4. 类类型接口(和抽象类有点相似)
    class Dog implements(实现) Animal
    interface Animal {
        name: string;
        eat():void;
    }
    class Dog implements Animal {
        public name:string;
        constructor(name:string){
            this.name = name
        }
        eat():void{
            console.log(this.name)
        }
    }
    
    var d1 = new Dog('dogdog')
    d1.eat()
    
  5. 接口拓展(接口可继承)
    interface Animal {
        name: string
    }
    interface Person {
        age: number
    }
    class Web implements Person {
        name: string
        age: number
        constructor(name:string, age:number){
            this.name = name
            this.age = age
        }
        getInfo():void{
            console.log(this.name + '--' + this.age)
        }
    }
    

6. 类

  1. 定义类
    class Person {
        name:string;
        constructor(name:string){
            this.name = name
        }
        run():void{
            console.log(this.name + '在运动')
        }
    }
    var p = new Person('张三')
    p.run()
    
  2. ts中实现继承
    class Person {
        name:string;
        constructor(name:string){
            this.name = name
        }
        work():void{
            console.log(this.name + '在工作')
        }
    }
    class Web extends Person {
        constructor(name:string){
            super(name)
        }
    }
    var w1 = new Web('程序员')
    w1.work()
    
  3. 继承的探讨,子类方法与父类一致
    子类方法会覆盖父类的方法
  4. 类中的修饰符
    1. public(公有的) 在类内部、子类、类外部都可以访问到该属性或方法
    class Person {
        public name:string;
        constructor(name:string){
            this.name = name
        }
    }
    var p1 = new Person('王五')
    console.log(p1.name)
    
    1. protected(受保护的) 在内部、子类中可以访问到该属性或方法,在类外部不能访问到该属性或方法
    class Person {
        protected name:string;
        constructor(name:string){
            this.name = name
         }
     }
    class Web extends Person {
        constructor(name:string){
            super(name)
         }
        eat():void{
            console.log(this.name + 'eating')  //子类中可以访问到该属性
         }
     }
    var p1 = new Person('王五')
    var web1 = new Web('小六')
    web1.eat()
    // console.log(p1.name)   //会报错,因为类外部不能访问protected属性
    // console.log(web1.name) //会报错,因为类外部不能访问protected属性
    
    1. private(私有的) 只能在类内部访问到该属性或方法
    class Person {
        protected name:string;
        constructor(name:string){
            this.name = name
         }
     }
    class Web extends Person {
        constructor(name:string){
            super(name)
         }
        eat():void{
            console.log(this.name + 'eating')  //报错
         }
     }
    var p1 = new Person('王五')
    var web1 = new Web('小六')
    web1.eat()
    // console.log(p1.name)   //会报错,因为类外部不能访问private属性
    // console.log(web1.name) //会报错,因为类外部不能访问private属性
    
  5. 静态属性、静态方法(static)
    • 加个static关键词就是静态方法或者静态属性
    • 静态方法不能直接调用实例属性和方法
    • 静态方法只能调用静态属性和方法??
  6. 多态
    在父类中定义方法但是不去实现,让它的子类去实现,每个子类有不同的表现
  7. 抽象类(abstract)
    抽象类不能直接被实例化,它其实类似一个标准,提供一个基类,规定抽象类中的子类必须实现基类中的抽象方法
    abstract class Person {
        abstract run():void
    }
    
    class Web extends Person {
        run(){
            console.log('run')
        }
    }
    
    var w1 = new Web()
    w1.run()
    

7. 泛型

解决类,接口,方法的可复用性,以及对不特定的数据类型的支持

  1. 函数泛型
    function getInfo<T>(value:T):T{
        console.log(value)
    }
    
    getInfo<number>(15)
    getInfo<string>('abc')
    
  2. 类泛型
    class MinClass<T>{
        public list:T[] = []
        add(value:T):void{
            this.list.push(value)
        }
        sort():any{
            var min:T = this.list[0]
            for(var i:number = 0 ; i < this.list.length ; i++){
                if(this.list[i] < min){
                    min = this.list[i]
                }
            }
            return min
        }
    }
    
    var m1 = new MinClass<number>()
    m1.add(1)
    m1.add(2)
    m1.add(-1)
    m1.add(-5)
    m1.add(10)
    alert(m1.sort())
    
  3. 接口泛型
    interface Config {
        <T>(key:T,value:T):T
    }
    var getInfo:Config = function<T>(key:T,value:T):T{
        console.log(`${key}--${value}`)
    }
    getInfo<number>(1,2)
    
  4. 把类当做参数的泛型类
     例子:定义一个操作数据库的库
     要求:有add、get、update、delete方法
     interface Dbi<T> {
        add(info:T):boolean
        get(id:number):boolean
        delete(id:number):boolean
        update(info:T,id:number):boolean
    }
    
    class User<T> implements Dbi<T>{
        add(info: T): boolean {
            console.log(info)
            return true
        }    
        get(id: number): boolean {
            throw new Error("Method not implemented.")
        }
        delete(id: number): boolean {
            throw new Error("Method not implemented.")
        }
        update(info: T, id: number): boolean {
            throw new Error("Method not implemented.")
        }
    }
    
    class U {
        username:string|undefined
        password:string|undefined
    }
    
    var u = new U()
    u.username = '123'
    u.password = '789'
    
    var user = new User<U>()
    user.add(u)
    

8. 模块和命名空间

import和export(浏览器中不能直接执行,要通过nodejs)

9. 装饰器

  1. 类装饰器
    传入一个参数
    对静态成员来说是构造函数,对实例成员来说是类的原型对象
    function logClass(params:any){
        return function(target:any){
            console.log(target)
            console.log(params)
        }
    }
    
    @logClass('aaa')
    class Per {
    
    }
    
  2. 属性装饰器
    传入两个参数
    1. 对静态成员来说是类的构造函数,对实例成员来说是类的原型对象
    2. 属性的名称
    function logAttr(params:any){
        return function(target:any, attrName:string){
            console.log(target.constructor)
            console.log(attrName)
        }
    }
    
    @logClass('aaa')
    class Per {
        @logAttr('as')
        public username:string|undefined
    }
    
  3. 方法装饰器
    传入三个参数
    1. 对静态成员来说是类的构造函数,对实例成员来说是类的原型对象
    2. 方法的名称
    3. 方法的属性描述符
    function logFn(params:any){
        return function(target:any, name:string, des:any){
            console.log(target)
            console.log(name)
            console.log(des)
        }
    }
    
    @logClass('aaa')
    class Per {
        @logAttr('as')
        public username:string|undefined
        @logFn('bbc') add():void{}
    }
    
  4. 方法参数装饰器
    传入三个参数
    1. 对静态成员来说是类的构造函数,对实例成员来说是类的原型对象
    2. 方法的名称
    3. 参数在函数列表中的索引
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341