2016-10-25 12 views
0

オプションで引数を取ることができるフィールドデコレータを作成したいと思います。 引数には、次のいずれかの値が含まれている必要があります。何もない、ブール値、または関数です。 私はこれを行う方法を知っているが、私は結果に100%満足していない:@RequiredのTypeScriptのデコレータにオプションのパラメータを追加する方法は?

export class TestClass{ 

    @Required(isRequired) 
    public testField: string; 

} 

export function isRequired():boolean{ 
    ... some validation logic, maybe depending on other fields... 
    return result; 
} 

は、インプリメンテーション:

export function Required(expression?: boolean|Function): Function { 
    return (target: any, key: string) => { 
     if (expression === null || typeof expression == 'undefined') { 
      expression = true; 
     } 
     console.log("Required found: " + expression, ":", target, key); 
     ... register the field and its validation expression for later usage 
    } 
} 

だから、これは正常に動作しますが、私はしたくないとき式を追加(したがって不履行「真」という表現を使用)し、私はこのようにそれを書くことができるようにしたい:

class TestClass{ 

    @Required 
    public testField: string; 

} 

私が言って活字体エラー(TS1240)を取得:

という式で呼び出されたときに、プロパティデコレータの署名を解決できませんでした。指定されたパラメータは

class TestClass{ 

    @Required() 
    public testField: string; 

} 

は、必要に応じて引数とする場合、その引数をとるデコレータの実装を記述することが可能です)だから私は@Requiredを(書く必要がコール ターゲット

のいずれかの署名と一致しません。指定されていない場合、 "()"を追加する必要はありませんか?

答えて

1

いいえ、おそらくそれはできません。
これは、デコレータに固有のシグネチャ(デコレータのタイプによって異なる)があるためです。
デコレータ関数を使用する場合は角括弧は必要ありませんが、a decorator factoryを使用する場合(例のように)、かっこを使用して呼び出す必要があります。

function Required(target: any, key: string, expression?: boolean | Function) { 
    if (expression === null || typeof expression == 'undefined') { 
     expression = true; 
    } 
    console.log("Required found: " + expression, ":", target, key); 
} 

function RequiredWith(expression: boolean | Function): Function { 
    return (target: any, key: string) => { 
     return Required(target, key, expression); 
    } 
} 

そして、あなたがいずれかを行うことができます:

class TestClass { 
    @Required 
    public testField: string; 
} 

または:あなたは何ができるか

は、2つの2に異なる機能に分離され

class TestClass2 { 
    @RequiredWith(true) 
    public testField: string; 
} 

code in playground)を