react-trackingのアンビエント宣言を作成中です。それはtrack
デコレータを公開しています。このデコレータは、クラスとの両方のメソッドで使用できます。多型デコレータ用のTypeScript宣言
ドキュメントから取られた簡単な例:
declare function track(trackingInfo?: any, options?: any): <T>(component: T) => T
declare function track(trackingInfo?: any, options?: any): any
export default track
:私は、次のような何かをして活字体が右のオーバーロードを選ぶ持つことができると期待私の周囲宣言ファイルで
import track from 'react-tracking'
@track({ page: 'FooPage' })
export default class FooPage extends React.Component {
@track({ action: 'click' })
handleClick =() => {
// ...
}
}
これはコンポーネントクラスではうまくいくが、次のエラーを伴うメソッドでは失敗する:
[ts] Unable to resolve signature of method decorator when called as an expression.
デコレータのこのアプリケーションでTSが選択するタイピングを見てみると、それは何かにマッチしなければならないシグネチャに戻るのではなく、コンポーネントクラスのものに落ちていないことを示します。
それがすべてで多型のデコレータを入力することは可能ですか?そしてもしそうなら、私は何が間違っていますか?
更新:ここでは簡略化した例を示します。
最初のものは、単形性であると期待どおりに動作:
function trackClass(trackingInfo?: any, options?: any): ClassDecorator {
return null
}
function trackMethod(trackingInfo?: any, options?: any): MethodDecorator {
return null
}
@trackClass({})
class Foo {
@trackMethod({})
someMethod() {}
}
この第二の例では、多型性であり、両方のために失敗:
function track(trackingInfo?: any, options?: any): ClassDecorator | MethodDecorator {
return null
}
@track({})
class Bar {
@track({})
someMethod() {}
}
第2の例は、あなたが 'ClassDecorator | MethodDecorator' - デコレータが呼び出されたときに "正しいことをする"ため、戻り値の型は 'ClassDecorator&MethodDecorator'です。 –