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></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> </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
掃碼關注公衆號,有更多精彩文章等你哦