【发布时间】:2016-08-04 05:39:12
【问题描述】:
我有一个环境 TypeScript 模块代表一个支持任何 Promises/A+ 库的库:
interface Test {
funcName():Promise<string>;
}
所以我需要调整它,使任何 Promise 库的协议都可以在声明级别访问:
interface Test<P> {
funcName():P<string>;
}
但是 TypeScript 在我使用它之前立即抱怨:Type 'P' is not generic。
请注意,我不能将自定义 Promise 库包含到与 Test 相同的文件中,因为我必须从另一个模块传入它。
如果我把代码改成这样:
interface AnyPromise<T, P extends Promise<T>> {
}
interface Test<P> {
funcName():AnyPromise<string, P<string>>;
}
它还在这部分抱怨error TS2315: Type 'P' is not generic.:P<string>。
最后我需要能够做这样的事情:
import * as promise from 'bluebird'; // from Bluebird ambient declarations
import {Test} from 'test';
var Test<promise> t; // plus initialize it;
t.funcName().finally(())=>{
}); // NOTE: 'finally' is to be visible from Bluebird (doesn't exist in ES6 Promise)
为了再次澄清,我仅使用 Bluebird 作为示例,因为我需要一种解决方案来支持任何 Promise 库,而不是特定的。
【问题讨论】:
-
为什么
Test<typeof promise>,不应该只是Test<promise>吗? -
@Bergi 告诉编译器将变量视为一个类。但这没关系,因为错误发生在该调用之前,同时解析类
Test。我已经更新了问题;) -
你需要定义一个
thenable 结构接口,虽然我认为 bluebird 在结构上会作为 ES2015 承诺传递,因为它具有完全相同的函数签名。 -
@BenjaminGruenbaum Bluebird 在我想要访问的标准 Promise 协议之上有很多额外的方法,所以我试图弄清楚如何将它作为动态参数模板化.
-
哦,你想让返回的promise的类型依赖于输入promise的类型吗?我不认为 TS 会这样做,但我会 ping @spion,他实际上是地球上唯一对此深感兴趣的人:P(更新:在一些人认为用泛型建模听起来不太难之后总的来说,我知道我可以在 C++ 中轻松做到这一点)
标签: typescript promise bluebird