2016-01-12 45 views
4

我正在閱讀Typescript的手冊,我注意到對我來說沒有意義的代碼段。有些人可以解釋這是什麼目的嗎?Typescript中這段代碼有什麼意義?

docs摘自:

class Greeter { 
    static standardGreeting = "Hello, there"; 
    greeting: string; 
    greet() { 
     if (this.greeting) { 
      return "Hello, " + this.greeting; 
     } 
     else { 
      return Greeter.standardGreeting; 
     } 
    } 
} 

var greeter1: Greeter; 
greeter1 = new Greeter(); 
alert(greeter1.greet()); 

var greeterMaker: typeof Greeter = Greeter; // This line 
greeterMaker.standardGreeting = "Hey there!"; // This line 
var greeter2:Greeter = new greeterMaker(); // And this line 
alert(greeter2.greet()); 

那麼,什麼文檔說是var greeterMaker: typeof Greeter = Greeter 「將舉行類本身。」我不能完全肯定這是什麼意思要麼

那麼它這樣的:

greeterMaker.standardGreeting = "Hey there!"; 

// Which does the exact same thing as this: 
Greeter.standardGreeting = "Hey there!"; 

缺少什麼我在這裏?

+2

我不認爲你錯過了什麼。他們在一個變量中引用類。他們使用該變量來修改該類。這只是一種間接。在這種情況下,可以通過執行'Greeter.standardGreeting =「嘿,你可以避免!」;「但是想象一下,把課程傳給一些不知道它的模塊,你會明白的。 – Esteban

回答

1

這是工作在TS'打字系統中以獲得對班級的參考,而沒有宣佈greeterMaker直接持有班級(我想foo: class可能是不允許的)。

理論上,即使右邊的值不是Greeter,但它是一些具有類似語義和相同公共靜態字段的其他類。它可以讓你動態地提供一個不同的類並使用它,但在這個例子中,並不是特別有用。

0

如果您運行代碼,您會看到「Hello,there」應顯示在警告框中。緊隨着「嘿!」!

靜態變量無法在類Greeter中更改,而無需將Typeof創建爲新類型。如果您嘗試添加 greeter.standardGreeting =「嘿,那裏!」;

它會報錯。

2

這部分文檔似乎試圖解釋Greeting類型和typeof Greeting類型之間的區別。

爲了理解這兩點,你必須首先理解TypeScript類是一個語法糖,它結合了(1)構造函數和(2)描述該構造函數生成的實例的接口。

所以,當你看到這一點:

class Greeter { 
    static standardGreeting = "Hello, there"; 
    greeting: string; 
    greet() { 
     // ... code ... 
    } 
} 

什麼你實際上正在做的是確定的東西,寫出來的手寫,看上去更像是這樣的:

interface Greeter { 
    greet(): void; 
} 

var Greeter: { 
    new(): Greeter; 
    prototype: Greeter; 
    standardGreeting: string; 
}; 

Greeter = function() {}; 
Greeter.prototype.greet = function() { 
    // ...code... 
}; 

換句話說,你」已經寫了描述Greeter實例的接口Greeter,以及描述構造函數的變量Greeter上的第二個匿名類型。 (這工作,因爲在一個單獨的,平行的命名空間不與生成的代碼中的變量名存在衝突的類型。)

使用Greeter接口類型是明顯不夠,只寫Greeter - 但如何做一個訪問該匿名類型附加到Greeter變量?答案是typeof類型修飾符。寫作typeof Greeter說「使用變量的類型 Getter」,它允許我們訪問分配給變量Greeter的匿名類型,該變量持有構造函數。

這就是文檔試圖解釋的內容。希望這個解釋更清晰,我們現在可以理解這部分代碼:

// This creates an alias called `greeterMaker` to the 
// Greeter constructor function 
// (functions are objects, and objects are always handled 
// by-reference in JavaScript) 
var greeterMaker: typeof Greeter = Greeter; 

// This modifies the `standardGreeting` property of the 
// function through the alias 
greeterMaker.standardGreeting = "Hey there!"; 

// This invokes the constructor function through the alias, 
// constructing a new instance of a Greeter 
var greeter2:Greeter = new greeterMaker(); // And this line