# 安装

npm install typescript -g

tsc --version

npm init -y

tsc --init

npm install @types/node --dev-save

# 转js

tsc xxx.ts

node xxx.js

# 自带支持es6

# vscode

ctrl ` 打开terminal

# 类型

var age:number = 18
var height:number = 178.5
console.log(age)
console.log(height)

var lz:string = 'fwefewf'

console.log(lz)

var b:boolean = true
var c:boolean = false

console.log(b,c)

enum REN{nan='nan', nv='nv', yao='yao'}
console.log(REN)
// { '0': 'nan', '1': 'nv', '2': 'yao', nan: 0, nv: 1, yao: 2 }
// { nan: 'nan', nv: 'nv', yao: 'yao' }

var t:any = 10
t = 'lz'
t=true
console.log(t)

// null

# 函数

function find(age:number=11, height?:string):string{
    let result:string = ''
    result = age + ''
    if (height) {
        result = result + height
    }
    return result
}

var age:number = 18
var height:string = 'fewfw'

var result:string = find()

console.log(result)
-------------------------------------
function find1(...arr:string[]):string{
    let result:string = ''
    arr.map((item, index) => {
        result += item
        if (index < arr.length - 1) {
            result += '、'
        }
    })
    return result
}

var result1:string = find1('1', '2', '3')

console.log(result1)

# 声明函数方式

// 函数声明法
function add (n1:number, n2:number):number {
    return n1 + n2
}

// 函数表达式
const add1 = function (n1:number, n2:number):number {
    return n1 + n2
}
console.log(add1(1, 2))

// es6
const add2 = (n1:number, n2:number):number => {
    return n1 + n2
}
console.log(add2(1, 2))

# 数组

// 字面量赋值
let arr1:number[] = [1,2,3]
let arr2:Array<string> = ['1','2']

// 构造函数赋值
let arr3:number[] = new Array(1,2)
let arr4:Array<number> = new Array(1,2)

// 元祖
let x :[string, number]
x = ['hello', 10]

# 日期

let d:Date = new Date(1000) // 1970-01-01 00:00:00     加的ms数
console.log(d)

let d1:Date = new Date('2019/05/27 05:27:00')
let d2:Date = new Date('2019-05-27 05:27:00')
let d3:Date = new Date('2019-05-27T05:27:00')
console.log(d1)
console.log(d2)
console.log(d3)

let d:Date = new Date(year,month,day,hours,minutes,seconds,ms);

# 正则

// 构造函数声明法
let reg1:RegExp = new RegExp('lz')
console.log(reg1)
let reg2:RegExp = new RegExp('lz', 'gi')    // g 全局 i 忽略大小写
console.log(reg2)

// 字面量声明
let reg3:RegExp = /lz/i
console.log(reg3)

// test
let reg4:RegExp = /lz/i
let s:string = 'lZ'
let result:boolean = reg4.test(s)
console.log(result)

// exec 找到返回数组,前面的为找到的,后面是输入的  没有 null
let reg5:RegExp =  /jspang/i
let website:string = 'jspang.com'
console.log(reg5.exec(website))
//[ 'jspang', index: 0, input: 'jspang.com' ]

#

// 类是对象具体事物的一个抽象,对象是类的具体表现
// 类名大驼峰法
class XiaoJieJie {
    name:string
    age:number
    constructor (name:string, age:number) {
        this.name = name
        this.age = age
    }
    say () {
        console.log('hao')
    }
}

let jie:XiaoJieJie = new XiaoJieJie('bingbing', 18)
console.log(jie)
jie.say()

# 修饰符

// public protectes private readonly

class XiaoJieJie {
    public sex:string
    protected name:string
    private age:number
    constructor (name:string, age:number, sex:string) {
        this.name = name
        this.age = age
        this.sex = sex
    }
    public say () {
        console.log('hao')
    }
    protected sayLove () {
        console.log('love')
    }
    public sayDo () {
        console.log('do')
    }
}

let jie:XiaoJieJie = new XiaoJieJie('bingbing', 18, 'man')
console.log(jie)
jie.say()

class Man {
    public readonly sex:string = 'nan'
}
let man:Man = new Man()


# 继承

// super 调父类东西   extends 继承

class Lz {
    public name:string
    public age:number
    public skill:string
    constructor(name:string,age:number,skill:string) {
        this.name = name
        this.age = age
        this.skill = skill
    }
    public hi () {
        console.log('hi')
    }
}

let lz:Lz = new Lz('来自', 18, 'web')
lz.hi()

class Lzz extends Lz {
    public size:number = 18
    public money () {
        console.log('money')
    }
    public hi () {
        super.hi()
        console.log('hi1')
    }
}

let lzz:Lzz = new Lzz('1', 19, '2')
console.log(lzz)
lzz.hi()
lzz.money()

# 接口

// search

interface Man {
    sex:string
    age:number
    maibaobao?:Boolean   // 可选参数
}
let myMan:Man = {sex:'nan', age:18,maibaobao:true}
console.log(myMan)



interface  SearchMan{
    (source:string,subString:string):boolean
}

let mySearch:SearchMan

mySearch = function(source:string,subString:string):boolean{
    let flag = source.search(subString)
    return (flag != -1)
} 

console.log(mySearch('高、富、帅、德','胖')) //false

# 命名空间

namespace ShuaiGe {
    export class Dehua {
        public name:string = 'liudehua'
        talk () {
            console.log(this.name)
        }
    }
}

namespace ShuaiGe1 {
    export class Dehua {
        public name:string = 'madehua'
        talk () {
            console.log(this.name)
        }
    }
}

let dehua:ShuaiGe.Dehua = new ShuaiGe.Dehua
let dehua1:ShuaiGe1.Dehua = new ShuaiGe1.Dehua

dehua.talk()
dehua1.talk()