Использование настраиваемого обещания в качестве универсального типа
У меня есть окружающий модуль TypeScript, представляющий библиотеку, которая поддерживает любую библиотеку Promises / A +:
interface Test {
funcName():Promise<string>;
}
Поэтому мне нужно настроить его так, чтобы протокол любой библиотеки обещаний был доступен на декларативном уровне:
interface Test<P> {
funcName():P<string>;
}
Но TypeScript немедленно жалуется:Type 'P' is not generic
прежде, чем я даже использую это.
Обратите внимание, что я не могу включить библиотеку пользовательских обещаний в тот же файл, что и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 в качестве примера, поскольку мне нужно решение для поддержки любой библиотеки обещаний, а не одной конкретной.