0

这与我提出的另一个问题非常相似,但也可以提出不同的问题,并且可能会被不同的受众发现有用。

我有一个用于淘汰验证的自定义规则:

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 });
}

但是,如果我尝试写这个,现在在 Typescript 土地上:

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

我现在得到错误:

不能在类主体的初始化程序或超级构造函数调用中引用关键字“this”

这是有道理的,但是我不确定我该如何做我最初会做的事情,除非我尝试将它破解到构造函数或其他东西中,这使得我的类现在看起来有点可怕。

4

1 回答 1

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 行额外的代码。

在我看来,代码的可读性要好一些,您不必阅读整条长线来查看它是什么类型的变量。进行这种分离可以更好地显示代码中发生的事情。也许它是一种美学的东西,但我发现将变量声明与“扩展”表达式混合有时难以阅读,尤其是当“扩展”非常错误时......扩展:)。

于 2013-03-28T13:44:18.380 回答