ジェネリックスをTypeScript定義に適用する際に問題があります。TypeScriptジェネリックコールバックの最後の引数を持つ関数を受け入れる
の定義は以下のとおりです。
export function readFile(path: PathLike | number, options: { encoding?: null; flag?: string; } | undefined | null, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void;
export function readFile(path: PathLike | number, options: { encoding: string; flag?: string; } | string, callback: (err: NodeJS.ErrnoException, data: string) => void): void;
export function readFile(path: PathLike | number, options: { encoding?: string | null; flag?: string; } | string | undefined | null, callback: (err: NodeJS.ErrnoException, data: string | Buffer) => void): void;
export function readFile(path: PathLike | number, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void;
あなたは、彼らが2〜3の引数を受け入れる見ることができ、そして最後の1は常にコールバックです。
今私の総称である:
function cbCall<Ret, Arg1, Arg2>(
fun: (arg1: Arg1, arg2: Arg2, cb: (error: any, result: Ret) => any) => any,
obj: any,
arg1: Arg1,
arg2: Arg2
): Context<Ret>;
それは3つの引数を持つ関数(コールバックされ、最後の1)私はそれが最初の3つの定義の一つにマッチする推測を予期しているため。私はこのようなcbCall
使用しようとするただし、:
CL.cbCall(
fs.readFile,
fs,
'filename',
{ encoding: 'utf-8' }
);
を私はエラーを取得:
Argument of type '{ encoding: string; }' is not assignable to parameter of type '(err: ErrnoException, data: Buffer) => void'.
だから何とかそれはarg2
はcb
をすることになっているものであることを期待しています。
テンプレートパラメータArg2
を削除し、それをobject
に置き換えても機能しますが、これは私の使用例で十分ではありません。
なぜそれが起こり、私が達成しようとしていることを達成できるかどうかを説明してください。
編集:cbCall<string, string, object>(...)
も使用しますが、もう一度、目的を破ります。
編集:また、それを修正した最初の二行の順序を変更する
function fun(arg: string, cb: (err: string, res: string) => void);
function fun(cb: (err: string, res: string) => void): void;
function fun(arg: any, cb?: any): void {
// noop
}
function call<Ret, Arg>(fun: (arg: Arg, cb: (err: string, res: Ret) => void) => any, arg: Arg) {
// noop
}
// this works
call<string, string>(fun,'test');
// Argument of type '"test"' is not assignable to parameter of type '(err: string, res: string) => void'.
call(fun,'test'); //
:私はこれまで例を簡素化。 しかし、最初に一致する宣言は使用されず、最後の宣言が使用されるべきではありませんか?
この回答を終了する時間がない場合に備えて、ここにリンクをドロップする:https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3117-type-inference –