typescriptでfunctionの引数、戻り値に型を定義する方法は？


以下の関数1と2がH型である事を保証させる書き方はありますでしょうか？

[↓このサンプルをブラウザのPlaygroundで直接実行させるリンクはこちら](https://www.typescriptlang.org/play?#code/C4TwDgpgBAElC8UAUBDAXAOwK4FsBGEATgDR5p4D2FANhChgJQIB8UAysIQJYYDmA3AFgAUAGMKGAM7AoEAB5gEUAN4BfKCkkaMIIWInSoAMwCMaOIlSkG8ZspFRHUQhGBZCGKACIKAay96qnoi8mAAdAAWFLzQlijWtvbCTs6u7p4+-oEiRlgYosBcEsYATFZ4DEkpLm4e3n4BIqpAA)

[code]

    type H = (a:number,b:boolean) => String;
    const exp = {} as any;
    const f1:H = (a,b)=>{
        return "ok";
    };
    /// ↓関数1
    exp.hoge = (a,b)=>{
        return "ok";
    }
    /// ↓関数2
    function f2(a,b){
        return "ok";
    }
    
[/code]

例えば関数2であれば以下のような書き方が出来ますが、それぞれの引数と戻り値に毎回これを書くのは大変なので、「この関数の引数と戻り値はH型です」と一発で書く方法を探しています。

[code]

    function f2(a:Parameters<H>[0],b:Parameters<H>[1]):ReturnType<H>{
        return "ok";
    }
    
[/code]

質問文の関数`f1`はまさに望み通りの書き方が出来ているのですが、この書き方だと関数1の様な使い方をしたい時にも一旦変数に入れる必要があるし、関数2の書き方と比べると関数のHoisting(巻き上げ)が発生したいので機械的に置き換える事が出来ません。




外しているかもしれませんが、行間を読んで回答してみます。  
直接的な解決策ではないですが、以下の工程を経て対応してみるのはいかがでしょうか？

  * <https://eslint.org/docs/latest/rules/no-use-before-define> 等を使って hoisting に依存しているコードを依存しない形に修正する
  * 上記が完了した後に H 型を適用していく

(なにかしら既存のレガシーコード的なコードベースの修正をしなければいけないという状況を想像しながら回答してみました。)




外しているかもしれませんが、行間を読んで回答してみます。  
直接的な解決策ではないですが、以下の工程を経て対応してみるのはいかがでしょうか？

  * <https://eslint.org/docs/latest/rules/no-use-before-define> 等を使って hoisting に依存しているコードを依存しない形に修正する
  * 上記が完了した後に H 型を適用していく

(なにかしら既存のレガシーコード的なコードベースの修正をしなければいけないという状況を想像しながら回答してみました。)

