[英]TypeScript classes : constructor and method
我試圖避免在Typescript類中進行雙重聲明。
在我寫這樣的課程之前:
module ModuleName {
export class ClassName {
public method: () => void;
constructor(
private dependency: any ) {
this.method = () => {
dependency.someUse();
};
}
}
}
但是方法類型的聲明(這里是public method: () => void;
)看起來沒有用,尤其是當您已經有一個聲明它的接口時。 所以我想寫:
module ModuleName {
export class ClassName {
constructor(
private dependency: any ) { }
public method = () => {
this.dependency.someUse();
};
}
}
注意:為了避免variable XXX used before declaration
警告variable XXX used before declaration
,我們必須將方法放在構造函數之后。
但是現在,如果我們在構造函數中使用方法,我們將再次收到有關此方法的警告:
module ModuleName {
export class ClassName {
constructor(
private dependency: any ) {
this.method(); // warning here
}
public method = () => {
this.dependency.someUse();
};
}
}
因此,我的問題是: 我們應該如何正確編寫類?
注意:當打字稿編譯器更正聲明的順序時,這沒什么大不了的,我只是想知道是否有可能在沒有雙重聲明和警告的情況下編寫類。
這聽起來像是TSLint的錯誤。 您是否正在使用WebEssentials進行任何更改?
您可能要禁用此規則,因為它說的似乎是錯誤的。 WebEssentials從用戶主目錄( %userprofile%
)加載tslint.json
。 您應該能夠在其中找到tslint.json文件。 在這里可以啟用/禁用規則。
聽起來以下規則中有錯誤
no-use-before-declare
禁止使用不允許在聲明變量之前使用變量
您可以通過添加(或更改)配置來禁用此規則:
"no-use-before-declare": false
關於tslint及其規則的更多信息可以在這里找到: https : //github.com/palantir/tslint/
最后,我認為刪除此警告不是一個好主意,因為在某些情況下它可能非常有用。
但是我找到了解決問題的方法:如果將構造函數移到類的末尾,則不再有警告:
module ModuleName {
export class ClassName {
public method = () => {
this.dependency.someUse();
};
constructor(
private dependency: any ) {
this.method();
}
}
}
如果我們看一下生成的JS,它更容易理解發生了什么:構造函數的參數仍然放在生成的函數的開頭:
var ModuleName;
(function (ModuleName) {
var ClassName = (function () {
function ClassName(dependency) {
var _this = this;
this.dependency = dependency;
this.method = function () {
_this.dependency.someUse();
};
this.method();
}
return ClassName;
})();
ModuleName.ClassName = ClassName;
})(ModuleName || (ModuleName = {}));
引起您variable XXX used before declaration
錯誤variable XXX used before declaration
因為將您的類方法聲明為類屬性。
而不是像這樣聲明您的方法:
public method = () => {
像這樣聲明:
public method() {
因此您的課程如下所示:
module ModuleName {
export class ClassName {
constructor(private dependency: any ) { }
public method() {
this.dependency.someUse();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.