2016-04-13 2 views
4

のために私はタイプArrayの特性にのみ使用可能です活字体でプロパティデコレータを持っています。プロパティの型がArrayない場合はこれを強制するために、TypeErrorは(プロパティの型情報を取得するためにreflect metadataを使用して)実行時にスローされます。プロパティデコレータは、特定のプロパティタイプ

function ArrayLog(target: any, propertyKey: string) { 
    if (Reflect.getMetadata("design:type", target, propertyKey) !== Array) { 
     throw new TypeError(); 
    } 

    // ... 
} 

しかし、私はこのあまりにDEV-優しい考えていません。 TypeScriptコンパイラで特定のプロパティデコレータを使用できるようにするにはどうすればいいですか特定のタイプのプロパティののみ?

+0

は、線に沿って何かを試してみてください? – Alex

+0

@Alex次のシグネチャを持つデコレータは、関数本体にかかわらず常に問題を生成します。 '(target:any、property:string | symbol)=> PropertyDescriptor'。引数の型を互換性のある型に変更することは役に立ちませんが、ここで問題を引き起こす戻り型です。 PropertyDescriptorを返すのはおそらく[サポートされている](https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators)ので、これは奇妙です。 –

答えて

0

取得したエラーは、返品式がないためです。私はそれが関連するだと確信し、あなたが得るそのエラーを認識していないが、あなたはそのコードを含めることができ

export function Decorator(fn:any) { 
    return (target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<Array>) => { 
    if (Reflect.getMetadata("design:type", target, propertyKey) !== Array) { 
     throw new TypeError(); 
    } 
    return descriptor; 
    }; 
} 
+0

私は、プロパティデコレータが 'descriptor'引数をとらないのを恐れています。少なくとも私はそれに関する文書を見つけることができず、コンパイラはそれを私に許しません: 'プロパティデコレータの署名を解決できません... ' –

+0

申し訳ありませんが、あなたは正しいです。それはメソッドデコレータです。私は、プロパティの解決策があるかどうかわかりません。おそらく、あなたはストレートプロパティの代わりにゲッターを作ることができます。 – ArcSine

関連する問題