2017-11-22 12 views
1

Typescriptで修飾されたプロパティの型を検証する方法はありますか? booleanクラスのプロパティでのみ動作するプロパティデコレータが欲しいです。 (以下の例)。これは可能ですか?プロパティデコレータを使用したプロパティタイプの厳密な型チェック

(注:反映-メタデータを経由して、活字体でちょうどコンパイルタイプの警告を私はランタイムの検証をしたくない)、この程度

function booleanProperty<T extends HTMLElement>(target: T, prop: string) { 
    // `target` will be the class' prototype 
    Reflect.defineProperty(target, prop, { 
    get(this: T): boolean { 
     return this.hasAttribute(prop); 
    }, 
    set(this: T, value: boolean): void { 
     if (value) { 
     this.setAttribute(prop, ''); 
     } else { 
     this.removeAttribute(prop); 
     } 
    } 
    }); 
} 

class MyElement extends HTMLElement { 
    @booleanProperty 
    foo: boolean; 

    @booleanProperty 
    bar: string; // TS compile error 
} 
customElements.define('my-element', MyElement); 
+0

ハンドブックを調べていないが、3番目の引数があることを思い出して、そこにジェネリックを定義してスコープしてもよい。ほんのちょっとした笑い、あなたのために働く希望。 – unional

答えて

1

何?

function booleanProperty< 
    T extends HTMLElement & Record<K, boolean>, 
    K extends string>(target: T, prop: K) { 
    // ... impl here 
} 

渡されたtargetニーズKが渡されたpropの一種であるキーK、でboolean性質を有するHTMLElementすることができます。それが動作するか見てみましょう:

class MyElement extends HTMLElement { 
    @booleanProperty // okay 
    foo: boolean; 

    @booleanProperty // error 
    bar: string; 
} 

私によく見えます。それはあなたのために働くのですか?

+0

賢い!私はそのような方法で 'prop'パラメータを絞り込むことについて考えなかった。 – Csvn

関連する問題