web-dev-qa-db-ja.com

TypescriptTSXとジェネリックパラメーター

TypeScriptでは、JSX構文のサポートが導入されています。したがって、従来の* .tsファイルでは非常にうまく機能する式がありますが、*。tsxファイルでは機能しません。

const f = <T1>(arg1: T1) => <T2>(arg2: T2) => {
   return { arg1, arg2 };
}

* .tsxファイル内で機能させる方法はありますか?

19
shadeglare

代わりに関数式を使用できます。

const f = function<T1>(arg1: T1) {
    return function<T2>(arg2: T2) {
        return { arg1, arg2 };
    };
};

または、代わりに、私はこれが機能することを発見しました:

const f = <T1, T2>(arg1: T1) => (arg2: T2) => {
   return { arg1, arg2 };
};

ちなみに、複数の汎用パラメーターが提供されている場合は正常にコンパイルされるようですが、1つではありません。たとえば、ダミーのジェネリックパラメータを指定すると、次のように機能します。

const f = <T1, _>(arg1: T1) => {
   return { arg1 };
};

// or just adding a comma
const g = <T1,>(arg1: T1) => {
   return { arg1 };
};

しかし、それは絶対に理想的ではありません。 1つの汎用パラメーターだけでこれを機能させる別の方法があるかもしれませんが、よくわかりません。

15
David Sherret

これは、あいまいさの問題を解析した結果です。これを明確にする1つのことは、T1に明示的な制約を追加することです。

const f = <T1 extends {}>(arg1: T1) => {
    return { arg1 };
}

T1のような型パラメーターには、とにかく暗黙的に{}の制約があるため、この場合、コードは機能的に同等です。

このソリューションを使用すると、元の例の各矢印関数に適用できます。

12