2016-06-22 89 views
6

this範圍內TypeScript方法的參數列表中?在打字稿中指定默認值時可以使用`this`嗎?

考慮following code

class Foo { 
    constructor(public name) {} 
    bar(str: string = this.name) { console.log(str); } 
} 

let f = new Foo("Yo"); 
f.bar(); 

即使我們不是一個實例方法體內的str默認值是使用this規定。

目前(以打字稿1.8)這個作品,因爲它是transpiled到:

Foo.prototype.bar = function (str) { 
    if (str === void 0) { str = this.name; } 
    console.log(str); 
}; 

所以this用於的方法,但這種規定是合法的嗎?

我無法找到一個答案,這與在specification粗略地看一眼。

注意:這是不合法的C++這使我懷疑它是一個預期的功能,或者只是一個人工翻譯過程。

回答

4

在部分8.3.1 Constructor Parameters明確指出使用this構造函數參數默認值表達式是一個錯誤。

8.4.2 Member Function Declarations部分中,沒有提及在普通類方法(非構造函數)的默認值表達式中使用this的任何錯誤。

6.6 Code Generation最後解釋說,代碼的形式產生:

if (<Parameter> === void 0) { <Parameter> = <Default>; } 

當參數是參數名稱和默認值是默認值表達式。

換句話說,當前規範明確允許在構造函數中使用參數默認值表達式中的this

根據規範,您的代碼完全有效。

4

是的。根據EcmaScript 6 specification有效,TypeScript轉譯器應該如此處理。

作爲默認參數在呼叫時計算,你甚至可以使用方法調用和其他參數的默認值。

+3

你知道在es6規範的哪裏嗎? – Alex

+0

[這裏](http://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions)中的規格。此外,還給出了一個很好的概述(https://developer.mozilla.org/cs/docs/Web/JavaScript/Reference/Functions/Default_parameters),指出默認參數在通話時進行評估。 –

相關問題