次のコードについて考えてみます。
interface Foo<T1> {
foo: string;
baz: T1;
}
function toFoo<T2>(value: T2): Foo<T2> {
return {
foo: 'bar',
baz: value
};
}
// Actually this function is imported from an NPM package so I can't change it
// The example is given for a better illustration
function memoize<T3, T4>(func: (arg: T3) => T4): (arg: T3) => T4 {
// Some implementation...
return func;
}
const memoizedToFoo: {<T5>(value: T5): Foo<T5>} = // ???
toFoo
この関数は汎用的です。私もtoFoo
それのメモ化されたバージョンをジェネリックにする必要があります。memoize
タイプと実装を変更することはできません。memoizedToFoo
与えられたインターフェースと一致するように実装する方法は?
私はこれを試しましたが、機能しません:
const memoizedToFoo<T5> = memoize(toFoo<T5>); // unexpected <T5>
memorize()
機能を変更できますか?頑張っています。
以下は、正しいタイプを自動的に推測します。
interface Foo<T1> {
foo: string;
baz: T1;
}
function toFoo<T2>(value: T2): Foo<T2> {
return {
foo: 'bar',
baz: value
};
}
function memoize<F extends Function>(func: F): F {
// Some implementation...
return func;
}
const memoizedToFoo = memoize(toFoo)
更新:変更できないためmemorize()
、次のように適切にオーバーライドできます。
// memorize.ts
import { memoize as origMemoize } from 'memoize'
// or if it is commonJS
import origMemoize from 'memoize'
export const memoize = origMemoize as <F extends Function>(func: F) => F
その後、オリジナルと同じように使用できます。
import { memoize } from './memoize'
// code away
このソリューションF
は、に制限されていないため、ある種の安全性とトレードオフすることに注意してください。(arg: X) => Y
これに適切に対処するには、https://github.com/Microsoft/TypeScript/pull/22368が必要です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加