2016-02-04 29 views
3

全部:類別定義在Typescript和ES6中混淆

我對ES6和打字稿非常新,目前並排研究。

當我來到類定義的一部分,有一個問題:

是否有類聲明它們之間的主要語法:

我發現的是:

在ES6,有隻方法可以聲明,但沒有構件:

class Greeter { 
    constructor(message) { 
     this.greeting = message; 
    } 
    greet() { 
     return "Hello, " + this.greeting; 
    } 
} 

儘管在打字稿,它允許聲明成員變量,以及:

class Greeter { 
    // although it declare a variable "greeting" here, but I am not sure if it allows assignment initialization 
    greeting: string; 
    constructor(message: string) { 
     this.greeting = message; 
    } 
    greet() { 
     return "Hello, " + this.greeting; 
    } 
} 

我不知道這是否是主要的語法差異(加訪問修飾符,有關於修改一個相關的問題:我讀了ES6類不能定義靜態成員,那麼什麼是允許定義點靜態方法?)之間呢?

如果不止於此,還有什麼需要注意的?

感謝

回答

1

您確實可以添加分配到財產申報,而這些任務基本上你寫在構造函數體內其他操作之前發生的權利。

class Greeter { 
    greeting = "world!"; 

    constructor() { 
    } 

    greet() { 
     return "Hello, " + this.greeting; 
    } 
} 

console.log(new Greeter().greet()); // Prints "Hello, world!" 

的另一面是,如果你使用任何在構造函數體範圍的,你會得到一個錯誤:

class Greeter { 
    greeting = message; // Error: 'message' isn't defined here 
    constructor(message: string) { 
    } 
    greet() { 
     return "Hello, " + this.greeting; 
    } 
} 

打字稿允許靜態屬性聲明,以及:

class Greeter { 
    private static instancesCreated = 0; 

    static getNumInstancesCreated() { 
     return Greeter.instancesCreated; 
    } 

    constructor() { 
     Greeter.instancesCreated++; 
    } 
} 

儘管這並不意味着靜態方法本身無用。 ES6沒有實例屬性聲明,但實例方法仍然有用,因爲您可以將屬性添加到實例上。

欲瞭解更多信息,我鼓勵您閱讀關於the TypeScript handbook以及TypeScript Deep Dive的TypeScript中的課程。

+0

謝謝,第一個和第二個代碼段是在TypeScript還是ES6中?因爲當我用babel將它編譯爲ES2015時,它在greeting =「world」時給了我錯誤;行,這意味着意外的令牌。 – kuanslove

+0

謝謝,我想我的問題之一是,如果我們不能在ES6中定義靜態變量,爲什麼ES6允許定義靜態方法? – kuanslove

+0

如上所述,靜態屬性只是您可以在靜態方法中分配的屬性,或者在定義了類本身之後,與在構造函數或常規方法中創建實例屬性的方式相同。 –

0

我認爲有兩件事情發生在這裏,首先,打字稿的預期 「類型擦除」,意思是:

打字稿

class Greeter { 
    greeting: string; 
    constructor(message: string) { 
    this.greeting = message; 
    } 
    greet() { 
    return "Hello, " + this.greeting; 
    } 
} 

將transpile到ES6

class Greeter { 
    constructor(message) { 
    this.greeting = message; 
    } 
    greet() { 
    return "Hello, " + this.greeting; 
    } 
} 

這使得因爲TypeScript類型意味着要被刪除,並且假定「greeting:string」只是類型信息是公平的。

如在類級聲明屬性類型的自然延伸,打字稿允許初始化性能,這點是ES6不(需要定義/初始化在構造這些屬性)。

所以,這打字稿

class Greeter { 
    greeting = "stranger"; 
    constructor(message: string) { 
    this.greeting = message || this.greeting; 
    } 
    greet() { 
    return "Hello, " + this.greeting; 
    } 
} 

將得到transpiled到ES6:

class Greeter { 
    constructor(message) { 
    this.greeting = "stranger"; 
    this.greeting = message || this.greeting; 
    } 
    greet() { 
    return "Hello, " + this.greeting; 
    } 
} 

不知道爲什麼ES6不允許在類定義的屬性,但是從打字稿角度來看,它會在類級別上已經非常奇怪的允許類型定義,並且在構造函數中初始化。

希望澄清一些事情。