TypeScript中的class声明了什么
在初看TypeScript的時候在這里卡住的時間難以估計,并不能很好的理解”換個角度說,我們可以認為類具有?實例部分與?靜態部分這兩個部分。“這句話。今天再回頭看這部分文檔,在同事的幫助下突然有了比較通透的理解。
class Greeter {static standardGreeting = "Hello, there";greeting: string;greet() {if (this.greeting) {return "Hello, " + this.greeting;} else {return Greeter.standardGreeting;}} }想要描述上面類聲明所表達的信息,需要從兩方面去描述:
這個類本身是什么類型?(JavaScript中類作為函數/對象所需要的描述)
這個類被實例化之后的結果是什么類型?(Java中的類所表達的類型信息)
類類型interface描述
類在JS中是函數的語法糖,那么描述類類型和描述函數類型應該沒啥區別,上面Greeter 類的類型可以描述如下:
interface GreeterInstanceType {greeting: string;greet(): string }interface GreeterType {standardGreeting: string;new (): GreeterInstanceType }使用上面的類型來聲明變量,確實沒有報錯,所以說明上面的類型可以描述class Greeter:
let test1: GreeterType = Greeter let intance1: GreeterInstanceType = new Greeter()上面的類型可以看出來有兩個interface配合起來才能描述類,而這兩部分分別對應的就是:
GreeterInstanceType描述的是類的實例部分
GreeterType描述的是類的自身
這兩部分就是TypeScript文檔中描述的實例部分和靜態部分。
類類型默認描述
上面是通過interface來描述class是可以做到的,對于描述類,TypeScript還提供了更友好的方法。
let test2: Greetertest2 = new Greeter()上面代碼中將類Greeter作為類型使用,這里表示的是test2是Greeter類型,這毋庸置疑。
但是Greeter本身表示的是什么呢? 這里表示的是Greeter這個類實例化的對象的類型。
可以換個角度來考慮,相同的代碼帶入到Java中,如下:
Greeter test2 = new Greeter();但是如果是這樣的一定是有問題的:
Greeter test2 = Greeter;這是說不通的,因為這里的意思是Greeter這個類型是Greeter這個類的類型。
所以Greeter類作為類型表示的是Greeter類實例對象的類型。
那么怎么通過Greeter類來表示這個類自身(也就是類作為JS函數的描述),而不是這個類的實例呢?
let intance1: typeof Greeter = Gretter上面的代碼可以理解為設置變量instance1的類型為Greeter類型的類型。
Greeter表示的是Greeter實例的類型,那么Greeter實例的類型自然就是Greeter這個類本身的類型。
繼續理解typeof:
typeof可以簡單理解為提取變量的類型,所以還可以如下使用:
let a: number = 1let b: typeof a = 2因為a的類型是number所以typeof a的值是number,所以b的類型就是number。
以上就是我理解的類聲明所表達的全部內容。
參考
typescript文檔 - 類
總結
以上是生活随笔為你收集整理的TypeScript中的class声明了什么的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码风格之Prettier简介
- 下一篇: Nginx 使用try_files遇到的