2

ノックアウト検証プラグインのTypeScript定義ファイルに取り組んでいます。私が立ち往生していることの1つは、そのライブラリで新しい検証ルールがどのように定義されているかと関係があります。

の基本的な同期バリデーターを作成する方法ko.validationは次のとおりです。

ko.validation.rules['myrulename'] = {
    message: 'default message to display when validation fails',
    validator: function (value, params) {
        // use value and params to evaluate rule, 
        // then return true if valid, false if invalid
    }
}

これは簡単ですが、非同期バリデーターを作成する方法は少し異なります。

ko.validation.rules['myrulename'] = {
    async: true,
    message: 'default message to display when validation fails',
    validator: function (value, params, callback) {
        // use value and params to evaluate rule, 
        // then invoke callback to indicate pass / fail
        // this function does not return a bool (it is void)
    }
}

非同期コールバックは、bool(検証の合格/不合格の場合)またはオブジェクトリテラル(isValid合格/不合格の場合、およびmessage検証メッセージの変更)のいずれかを取ることができます。このために、私は以下を作成しました:

interface KnockoutValidationAsyncCallbackArgs {
    isValid: bool;
    message: string;
}

interface KnockoutValidationAsyncCallback {
    (result: bool): void;
    (result: KnockoutValidationAsyncCallbackArgs): void;
}

KnockoutValidationStaticこれは、ルール配列を公開するmyの縮小バージョンです。また、文字列のインデックスを指定するためのルール配列用の特別なインターフェイスを作成しました。

interface KnockoutValidationRulesArray extends Array {
    [index: string]: KnockoutValidationRule;
}

interface KnockoutValidationStatic {
    rules: KnockoutValidationRulesArray;
    ... other members defined on this interface
}

interface KnockoutStatic {
    validation: KnockoutValidationStatic;
}

私が立ち往生しているのはKnockoutValidationRuleです。私は以下を試しました:

interface KnockoutValidationRule {
    async?: bool;
    message: string;
    validator(value: any, params: any): bool;
    validator(value: any, params: any, callback: KnockoutValidationAsyncCallback): void;
}

これは、同期バリデーター宣言に対して正常に機能します。ただし、非同期のものを作成すると、次のエラーが発生します。

'{メッセージ:文字列;を変換できません バリデーター:(値:any、params:any、callback:KnockoutValidationAsyncCallback)=> void}'から'KnockoutValidationRule':プロパティのタイプ'バリデーター'タイプ'{メッセージ:文字列; バリデーター:(値:any、params:any、callback:KnockoutValidationAsyncCallback)=> void; }'と'KnockoutValidationRule'には互換性がありません。

タイプ'(値:any、params:any、callback:KnockoutValidationAsyncCallback)=>void'および'{(値:any、params:any):bool;のシグネチャを呼び出します。(値:any、params:any、callback:KnockoutValidationAsyncCallback):void; }は互換性がありません:

コールシグニチャは2つ以下のパラメータを想定しています

コールバックをオプションのパラメーターにすることも検討しましたが、関数が署名に応じて異なる値を返すため、これは機能しません(3番目の引数がない場合はブール値、3番目の引数が存在する場合は無効)。

私はここで何が間違っているのですか?ルールの文字列インデックス配列に何か問題がありますか?このライブラリの動作に基づいてTypeScriptインターフェイスを作成することは可能ですか?

アップデート1

KnockoutValidationRuleインターフェースの過負荷で正しい方向に進んでいたようです。ko.validation.rulesに変更するKnockoutValidationRulesArrayKnockoutValidationRule[]、テストコードが同期バリデーターと非同期バリデーターの両方で正常にコンパイルされることを発見しました...

interface KnockoutValidationStatic {
    //rules: KnockoutValidationRulesArray; // this breaks it
    rules: KnockoutValidationRule[] // this fixes it
    ... other members defined on this interface
}

配列が間違っていると宣言していますか?

アップデート2

定義をテストするために使用しているサンプルコードを次に示します。

/// <reference path="../../ko/knockout-2.2.d.ts" />
/// <reference path="../../ko/knockout.validation.d.ts" />

module TestKoVal {

    ko.validation.rules['test1'] = {
        message: '',
        validator: (value: any, params: any): bool => {
            return false;
        }
    }

    ko.validation.rules['test2'] = {
        async: true,
        message: '',
        validator: function (value: any, params: any, callback: KnockoutValidationAsyncCallback): void => {
            callback(false);
            callback(true);
            callback({ isValid: false, message: 'custom' });
        }
    }
}

私が言ったように、上記ko.validation.rulesはがであるときにうまくコンパイルされますKnockoutValidationRule[]。に変更すると失敗しますKnockoutValidationRulesArray

4

2 に答える 2

0

上記が機能しない理由を理解できたと思います。JavaScript では、文字列をインデクサーとして [] 配列構文を使用する場合、通常の意味で配列を作成していません。代わりに、その構文はオブジェクトにプロパティを追加するだけです。以下は機能的に同等です。

ko.validation['test1'] = { ... };
ko.validation.test1 = { ... };
于 2012-12-23T15:38:41.170 に答える
0

KnockoutValidationRule を変更することで、この問題を回避できます。

export interface KnockoutValidationRule {
    async?: bool;
    message: string;
    validator: (value: any, params: any, callback?: KnockoutValidationAsyncCallback): bool;
}

そして、これが使用されている場所に対応する変更を加えます:

ko.validation.rules['test2'] = {
    async: true,
    message: '',
    validator: (value: any, params: any, callback?: KnockoutValidationAsyncCallback): bool => {
        callback(false);
        callback(true);
        callback({ isValid: false, message: 'custom' });
    }
}

これにより、2 つのメソッド シグネチャが統合されます。検証メソッドは実際には bool を返す必要はないため、メソッドが bool を返すように宣言されているという事実は、主に見た目/美的問題です。

JavaScript ライブラリでの使用が一般的ではないため、 codeplex サイトでこれに関するディスカッションを開くことは価値があるかもしれません。

于 2012-12-23T16:38:22.580 に答える