typescript 入門教程四

ts中的function和接口
interface PrintCallback{
    //  匿名函數,返回類型爲空
     (success:boolean):void
}
interface Person{
    //只讀
    readonly first_name:string
    // 可選
    last_name?:string
    print(callback:PrintCallback):void
}
/**
 * 即使pCallback的類型定義爲接口PrintCallback,其參數也可以爲空
 * 如果pCallback寫了參數,只要參數類型和函數返回類型遵從PrintCallback即可,即使參數名字不一樣也是可以的
 */
let pCallback:PrintCallback=(suc:boolean)=>{
    console.log("callback",suc)
}
let pe:Person={
    first_name:'tome',
    print:(callback:PrintCallback):void=>{
        callback(true)
    }
}
pe.print(pCallback)

<center>file</center>

類型斷言

類型斷言和強制類型轉化的區別就是,類型斷言沒有改變變量的實際類型,但是強制類型轉化已經改變變量的類型,類型斷言是在編譯時期,強制類型轉化是發生在運行時期
在ts中,類型斷言是在編譯過程中,當程序員知道該變量的類型,會通過類型斷言方式告訴編譯器,該變量是哪個類型,使得編譯更加通暢,注意類型斷言只是出現在編譯過程中

let x:any='i am jack'
/**
 * 上面x可能是任何類型,編譯器可能不知道x到底屬於什麼類型變量
 * 這是通過<string>表示把x斷言成字符串類型,就是告訴編譯器要把x當成字符串處理,
 * 這是就可以調用字符串處理函數substring了
 */
let s=(<string>x).substring(0,3)

interface Person{
    name:string
    age:number
    first_name:string
}
// 第二種斷言的方式,這時候如果不加as斷言,編譯不通過,注意在js中,是可以在空的對象上加新的屬性的,但是ts中是會編譯失敗的
let per={} as Person
per.name='jack'
per.age=12
per.first_name='tome'
單繼承,多實現
// 接口可以繼承其他接口,類可以繼承一個單獨的類,但是可以實現多個接口,單繼承,多實現
interface Person{
    name:string
}
interface Programmer extends Person{
    age:number
}
let p:Programmer={
    name:'jack',
    age:12
}
// 如果一個類實現一個接口,必須要實現接口中的所有的屬性和方法
class P implements Person{
    name:string
    constructor(name:string){
        this.name=name
    }    
}

// 如何用ts描述下面的列表結構 
[
    {
        "userId": 1,
        "id": 1,
        "title": "sunt aut facere",
        "body": "quia et suscipit"
    },
    {
        "userId": 1,
        "id": 2,
        "title": "qui est esse",
        "body": "est rerum temporepossimus qui neque nisi nulla"
    }
] 
// 可以先定義一個接口
interface todoList{
    userId:number
    id:number
    title:string
    body:string
}   
//然後定義數組的類型爲藉口類型
let arr:todoList[]=[
    {
        "userId": 1,
        "id": 1,
        "title": "sunt aut facere",
        "body": "quia et suscipit"
    },
    {
        "userId": 1,
        "id": 2,
        "title": "qui est esse",
        "body": "est rerum temporepossimus qui neque nisi nulla"
    }
] 

<center>file </center>

抽象類:abstract
  • 抽象類或者接口均是不能實例化的,除非繼承或者實現它的子類纔可以實例化
  • 繼承抽象類的子類必須要實現抽象類中的抽象方法和抽象屬性
abstract class Person {
    constructor(name:string) {
        this.name=name
    }
    name:string
    display():void{
        console.log(this.name)
    }
    // 下面是抽象類區別於類的關鍵,定義一個抽象方法,注意抽象方法是沒有方法體的
    abstract find(str:string):void
}
class Programmer extends Person{
    
    age:number
    constructor(name:string,age:number) {
        super(name)//super是必須調用
        this.age=age
    }
    // 子類必須要實現抽象類的抽象方法
    find(str: string): void {
        console.log(str)
    }
}
let p:Programmer=new Programmer('jack',22)
補充:ts中如何定義一個函數類型的變量
 //第一種方法
 let d:(param:string)=>string
 d=function(pa:string):string{
    return pa
 }
 console.log(d('tome'))
//  第二種,用接口方法
interface Fn{
    (param:string):string
}
let f:Fn=(pa:string):string=>pa

掃碼關注公衆號,有更多精彩文章等你哦

file

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章