TypeScript 语法

2021-02-01  本文已影响0人  kevin5979

typeScript 数据类型

1. 布尔类型(boolean)
  let flag:boolean = true
  flag = 123  // 错误
  flag = false  //正确
2. 数字类型(number)
  let num:number = 123
  num = "str"      // 错误
  num = 111        // 正确   
3. 字符串类型(string)
let str:string = 'this is ts'
str = 123       // 错误
str = "123"     // 正确
4. 数组类型(array)
 // ts 中定义数组有三种方式
  // 1.第一种方式: 数组中的所有数据都是 number 类型
  let arr:number[] = [11,22,33]
 // 2.第二种方式: 数组中的所有数据都是 number 类型
  let arr:Array<number> = [11,22,33]
 // 3.第三种方式: 数组中的所有数据任意类型
  let arr:any[] = ['11',22,undefined,true]
5. 元组类型(tuple)
 // 元组类型属于数组的一种
let arr:[number,string] = [123,"123"]
6. 枚举类型(enum)
enum Flag {success = 1,error = 2}
let s:Flag = Flag.success
let f:Flag = Flag.error
console.log(s,f)    // 1 0

enum Color {blue,red = 3,'orange'}
let c:Color = Color.blue
console.log(c)  // 0   如果标识符没有赋值 它的值就是下标
let d:Color = Color.orange
console.log(d)  // 4   
7. 任意类型(any)
let num:any = 123
num = "str"
console.log(num)    // str
let oBox:any = document.getElementById('box')
oBox.style.color = 'red'
8. null 和 undefined
 // null 和 undefined 是其他类型(never类型)的子类型
let num1:number
console.log(num1)  // undefined 报错
let num2:undefined
console.log(num2)  // undefined 正确
let num3: number | null | undefined
console.log(num3)  // undefined 正确
9. void 类型
  // 表示没有任何类型,一般用于定义方法的时候没有返回值
function run():void{
console.log('run')
}
  run() 
function run():number{
  return 123
}
  run()
10. never 类型
// never类型: 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值
// 这意味着声明 never 的变量只能被 never 类型所赋值
let a:undefined
 a = undefined  // √
 a = null  // ×

typeScript 函数

function run():string{
    return 'run'
}
const run = function():number{
    return 123
}

function getInfo(name:string,age:number):string{
    return `${name} --- ${age}`
}
const getInfo = (name:string,age:number):string=>{
    return `${name} --- ${age}`
}
const run = (name:string):void=>{
    console.log(name)
}
function getInfo(name:string,age?:number):string{
    if(age){
        return `${name} --- ${age}`
    }else{
        return `${name} --- 年龄保密`
    }
}
console.log(getInfo('zhangsan'))
console.log(getInfo('zhangsan',123))
function getInfo(name:string,age:number = 20):string{
    if(age){
        return `${name} --- ${age}`
    }else{
        return `${name} --- 年龄保密`
    }
}
console.log("张三")
console.log("张三",30)
function sum(...result:number[]):number{
    let sum = 0
    for(let i = 0; i < result.length; i++){
        sum += result[i]
    }
    return sum
}
alert(sum(1,2,3,4,5))

// java: 重载指的是两个或两个以上同名函数,但它们的参数不一样,这时会出现函数重载的情况
// ts: 通过为同一个函数提供多个函数类型定义来实现多种功能的目的
function css(config:string):string
function css(config:string,value:number):string

function css(config:string,value?:number):string{
    if(value){
        console.log(config,value)
    }else{
        console.log(config)
    }
}

typeScript 类

function Person(){
    this.name = '张三'
    this.age = 20
    this.run = function(){  // 实例方法
        console.log(this.name + "在run")
    }
}

Person.getInfo = function(){
    alert('我是静态方法')
}

Person.prototype.sex = "男"
Person.prototype.word = function(){
    console.log(this.name + "在word")
}

let p = new Person()
alert(p.name)
p.word()
Person.getInfo()

// Web类 继承Person 类      原型链 + 对象冒充的组合继承模式
function Web(){
    Person.call(this)
}

let w = new Web()
w.run()     // 对象冒充可以继承构造函数里面的属性和方法
w.word()    // 对象冒充不可以继承原型链里面的属性和方法

Web.prototype = new Person()    // 原型链实现继承      // 缺点: 不能传参
let w = new Web()
w.run()     // 原型链实现继承可以继承构造函数里面的属性和方法
w.word()    // 原型链实现继承可以继承原型链里面的属性和方法


let w = new Web('张三',20)    // 实例化子类的时候没法给父类传参
w.run()         // undefined

function Person(name,age){
    this.name = name
    this.age = age
    this.run = function(){
        alert(this.name + "在 run")
    }
}
Person.prototype.sex = "男"
Person.prototype.word = function(){
    alert(this.name + "在 word")
}

function Web(name,age){
    Person.call(this,name,age)  // 对象冒充继承  实例化子类可以给父类传参
}

Web.prototype = Person.prototype
let w = new Web('张三',28)
w.run()
w.word()
class Person{
    name:string;    // 属性,前面省略了 public 关键词
    constructor(name:string){   // 构造函数 实例化类的时候触发的方法
        this.name = name
    }
    run():void{
        alert(this.name + "在 run")
    }
    getName():string{
        return this.name
    }
    setName(name:string):void{
        this.name = name
    }
}
let p = new Person('张三')
p.run()
alert(p.getName())
class Person{
    name:string
    constructor(name:string){
        this.name = name
    }
    run():void{
        alert(this.name + "在 run")
    }
    getName():string{
        return this.name
    }
    setName(name:string):void{
        this.name = name
    }
}

let p = new Person('李四')
p.run()
alert(p.getName())

class Web extends Person{
    constructor(name:string){
        super(name)
    }
    word(){
        alert(this.name + "在 word")
    }
    run():void{
        alert(this.name + "在 run ---> 子类")
    }
}

let w = new Web('王五')
w.run()
w.word()

范围 public(公有的) protected(保护类型) private(私有)
当前类里面
子类 ×
类外面的实例 × ×
function Person(){
    this.run = function(){
        // 实例方法
    }
}
Person.run = function(){
    // 静态方法
}

class Person{
    public name:string
    static age:number
    constructor(name:string){
        this.name = name
    }
    run(){
        // 实例方法
        alert(this.name + "在 run")
    }
    static work(){
        // 静态方法
        alert(this.name + "在 work") //  ×
        // 静态方法随着类的加载而加载
        // 对象是在类存在后才能创建
        // 所以静态方法优先于对象存在
        // 不能再静态方法里访问成员变量
        alert(Person.age + "666")   //  √
    }
}
let p = new Person("张三")
p.run
Person.work()

// 父类定义一个方法不去实现,让继承它的子类去实现,每个子类有不同的表现
// 多态属于继承
class Animal{
    name:string
    constructor(name:string){
        this.name = name
    }
    eat(){
        console.log("eat")
    }
}

class Dog extends Animal{
    constructor(name:string){
        super(name)
    }
    eat(){
        console.log("Dog eat")
    }
}

class Cat extends Animal{
    constructor(name:string){
        super(name)
    }
    eat(){
        console.log("Cat eat")
    }
}


// ts 中的抽象类: 它是提供其他继承的基类,不能直接被实例化
// 用 abstract 关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现并且必须在派生类中实现
abstract class Animal{
    public name:string
    constructor(name:string){
        this.name = name
    }
    abstract eat():any
    run(){
        console.log("其他方法可以不实现")
    }
}

class Dog extends Animal{
    // 抽象类的子类必须实现抽象类里的方法
    constructor(name:string){
        super(name)
    }
    eat(){
        console.log(this.name + " eat")
    }
}
let d = new Dog("66")
d.eat()

// 接口: 起到一种限制和规范的作用
// 对方法传入的参数进行约束
function printLabel(labelInfo:{label:string}):void{
    console.log('printLabel')
}

printLabel({name:"张三"})     // ×
printLabel({label:"张三"})    // √

// 对批量方法传入参数进行约束
interface FullName{
    fName:string
    sName:string
}


function printName(name:FullName){
    // 必须传入对象 fName sName
    colnsole.log(name.fName,name.sName)
}

printName('123')    // ×

printName({         // ×
    age:20,
    fName:"张",
    sName:"三"
})

let obj = {
    age:20,
    fName:"张",
    sName:"三"
}

printName(obj)      // √
// 接口: 可选属性
interface FullName{
    fName:string
    sName?:string
}

function printName(name:FullName){
    colnsole.log(name.fName,name.sName)
}

printName({
    fName:"张"
})

// 例子
interface Config{
    type:string
    url:string
    data?:string
    dataType:string
}

function ajax(config:Config){
    let xhr = new XMLHttpRequest()
    xhr.open(config.type,config.url,true)
    xhr.send(config.data)
    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4 $$ xhr.status == 200){
            console.log('成功')
            if(config.dataType === 'json'){
                console.log(JSON.parse(xhr.responseText))
            }else{
                console.log(xhr.responseText)
            }
        }
    }
}

ajax({
    type:'get',
    url:'http://a.itying.com/api/productlist',
    dataType:'json'
})
// 对方法传入的参数 以及返回值进行约束
// 加密的函数类型接口
interface encrypt{
    (key:string,value:string):string
}
let md5:encrypt = function(key:string,value:string):string{
    // 模拟操作
    return key + value
}

console.log(md5('name',"zhangsan"))
// 对数组的约束
interface UserArr{
    [index:number]:string
}
let arr:UserArr = ['aaa','bbb']
console.log(arr[0])

// 对对象的约束
interface UserObj{
    [index:string]:string
}
let arr:UserObj = [name:'zhangsan']
console.log(arr['name'])
// 4. 类类型接口和抽象类 相似
interface Animal{
    name:string
    eat(str:string):void
}

class Dog implements Animal{
    name:string
    constructor(name:string){
        this.name = name
    }
    eat(){
        console.log(this.name + 'Dog eat')
    }
}

ts 接口扩展

// 接口可以继承接口
interface Animal{
    eat():void
}
interface Person extends Animal{
    work():void
}
class Programmer{
    public name:string
    constructor(name:string){
        this.name = name
    }
    coding(code:string){
        console.log(this.name + code)
    }
}
    
class Web extends Programmer implements Person{
    constructor(name:string){
        super(name)
    }
    eat(){
     console.log(this.name + "eat")
    }
    work(){
        console.log(this.name + "work")
    }
}
let w = Web("小李")
w.eat()
w.work()
w.coding("ts")

END
上一篇下一篇

猜你喜欢

热点阅读