根据泛型函数

时间:2018-01-31 21:19:57

标签: typescript

我正在为第三方库添加类型;特别是blessed

Program类有一个函数可以进行回调并运行return callbackhttps://github.com/chjj/blessed/blob/master/lib/program.js#L2866

这是一个精简版:

Program.prototype.saveReportedCursor = function (callback) {
  if (!callback) return;
  return callback();
}

这意味着回调是可选的,但如果调用它,则类函数将返回回调返回的内容。这可能完全没什么,应该什么都不是,但我只是想知道如何将其指定为类型:

// program.d.ts
export class Program {
  saveReportedCursor(callback: Function): <return value of Function>;
}

我尝试过使用saveReportedCursor<T>(callback: <T>() => T?): T;。这确实有效,但它不准确,因为回调可以接受参数,而且你必须在saveReportedCursor而不是TypeScript上使用回调定义时的回调值来设置泛型类型。

有没有办法让类函数在事先不知道的情况下使用函数参数的返回类型作为返回类型?

1 个答案:

答案 0 :(得分:2)

你很接近回调本身不一定是通用的,只有函数:

export class Program {
    // public signatures
    saveReportedCursor(): void
    saveReportedCursor<T>(callback?: () => T): T
    // implementation signature
    saveReportedCursor<T>(callback?: () => T): T {
        return callback();
    }
}

let x = new Program().saveReportedCursor(() => 10); // x is number
new Program().saveReportedCursor(); // Return type is void if no callback is spcified