2013-03-28 62 views
0

這與我活躍的另一個問題非常相似,但也可能會要求它與其他問題非常相似,並且可能會被不同的受衆發現有用。TypeScript的自定義敲除驗證規則

我有淘汰賽驗證自定義規則:

ko.validation.rules["sameAs"] = { 
    validator: function (val, otherObservable) { 
     return val === otherObservable(); 
    }, 
    message: "Value should be same as {0}, but differs" 
}; 

現在,在原材料的javascript這工作細如使用看起來像:

function SomeObject() { 
    this.Email = ko.observable().extend({ required: true, email: true }); 
    this.ConfirmationEmail = ko.observable().extend({ required: true, email: true, sameAs: this.Email }); 
} 

但是現在打字稿土地,如果我嘗試這樣寫:

class SomeObject { 
    public Email = ko.observable().extend({ required: true, email: true }); 
    public ConfirmationEmail = ko.observable().extend({ required: true, email: true, sameAs: this.Email }); 
} 

我現在得到的錯誤:

Keyword 'this' cannot be referenced in initializers in a class body, or in super constructor calls

這是有道理的,但我不知道我該怎麼做什麼,我會原本已經做了,除非我嘗試它侵入構造或什麼的,這讓我的班,現在看起來有點可怕。

回答

2

我找不到寫作的任何缺點:

class SomeObject { 
    public Email = ko.observable(); 
    public ConfirmationEmail = ko.observable(); 

    constructor() { 
     this.Email.extend({ required: true, email: true }); 
     this.ConfirmationEmail.extend({ required: true, email: true, sameAs: this.Email }) 
    } 
} 

除了2的代碼,其他行。

在我看來,代碼可讀性好一點,你不必閱讀整條長行來看它是什麼類型的變量。 做這個分離你可以更好地展示你的代碼正在發生什麼。也許它是一種審美的東西,但我發現混合變量聲明和'擴展'表達式有時難以閱讀,尤其是當'擴展'相當錯誤...擴展:)。

+0

就像你說它的個人喜好一樣,我更喜歡在一個地方看到與該變量相關的所有內容,而不必環顧四周,也更喜歡我的PO * O對象沒有構造函數,因爲它們沒有邏輯,但像你說的那樣解決了這個問題。 – Grofit