為了簡便,以後把
typescript
簡寫為ts
介面Interface
可能有些同學對於介面比較陌生,在弱型別語言的語言層面很難看到它的蹤影,不像強型別語言,語言層面就考慮到了。但在ts
世界裡,我們就可以看到它的蹤影了,說白了,它只負責定義,說明你的物件裡面有些什麼,也就是結構,當然,它就不能夠被例項化了。
定義
那麼,該如何定義介面呢,當然是使用關鍵字interface
interface IA {
name: string
}
以上宣告瞭介面IA
,有個屬性name
,為字串型
這樣,我們就可以給一個變數宣告IA型別並賦值初值
var a: IA = {
name: `hello`
}
繼承
介面也是可以繼承的,假如你有個IB
介面也包含IA
的結構,就可以簡單的繼承它,並擴充套件自己的屬性
interface IB extends IA {
id: number
}
類
類與介面類似,但它除了定義外,還有實現,如給變數賦值,它是可以例項化的
定義
定義的關鍵字是class
,相信熟悉es6
的同學已經早就用的習以為常了
class A {
a: string = `xxxxx`
}
以上定義了類A
,它有個字串型別a
,同時給它賦了初值xxxxx
,這樣我們可以像下面這樣用,例項化它,並可以引用屬性a
var a = new A()
console.log(a.a)
當然我們也可以修改屬性a
共有,私有,受保護等成員訪問修飾符
屬性有訪問許可權之分,哪些成員可以訪問,誰可以訪問
-
public
也就是誰都可以訪問 -
private
只有內部成員可以訪問,說白了,就是自帶的函式可以訪問 -
protected
受保護的,除了自己,繼承了該類的都可以訪問
以上關鍵字一般加在屬性前面,不加的話,就是public
所謂成員,不要僅限於屬性,還包括方法,也叫函式,但是在類中一般都叫方法
class A {
public a = `a`
private b = `b`
protected c = `c`
}
注意,以上宣告的時候沒有給屬性指定型別,這是合法的,因為可以根據後邊的初值推斷出相應的型別
建構函式
說到了類,自然是少不了建構函式,這個函式比較特別,是在例項化的時候呼叫的,也就是new
的時候;強型別語言中一般都是以類名來命名的一個函式,ts
中是以constructor
來定義和實現的,當然嚴格來說,是js
中是這樣規定的。
其實建構函式跟普通函式沒什麼區別,可以有引數,函式體裡面就是實現,可以給屬性賦初值等操作,改寫以上A
,把給a
即使你定義任何建構函式,也會有一個預設建構函式的,只是它什麼都沒幹
class A {
a: string
constructor(arg: string) {
this.a = arg
}
}
在ts
中,建構函式還有個神奇的功能,那就是在建構函式引數中定義和賦初值,不用在類中重複宣告,在建構函式中賦初值,如下
class A {
constructor(public a: string)
}
上面我們就定義了A
中的一個字串屬性a
,把建構函式的第一個引數賦值給它
繼承
跟介面類似,類繼承也是用關鍵字extends
class B extends A {
d: number = 1
}
實現介面
類不僅可以繼承已有類,還可以實現介面,要注意的是,介面中的屬性,類中必須有相應的實現
實現的關鍵字是implements
class C implements IA {
name = `c`
}
當然你可以實現和繼承同時用,也是沒問題的
class D extends A implements IA {
name = `d`
}
靜態成員
普通成員在每個例項中是單獨存在的,而靜態成員是在類中共享的,也就是隻有一份,靜態成員宣告的方式是使用關鍵字static
class A {
static sa = `nnnn`
}
以上我們就宣告瞭一個字串屬性sa
,並賦初值nnnn
,當需要訪問的時候,只要像下面呼叫就好了
A.sa
關於介面與類的東西還挺多的,由於篇幅有限,先到此處吧,更多內容,以後在講