ノックアウト検証プラグインの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
に変更するKnockoutValidationRulesArray
とKnockoutValidationRule[]
、テストコードが同期バリデーターと非同期バリデーターの両方で正常にコンパイルされることを発見しました...
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
。