у меня есть модуль окружающей среды машинописи представляет собой библиотеку, которая поддерживает любые посылы/A + библиотека:Использования пользовательского перспективны в качестве универсального типа
interface Test {
funcName():Promise<string>;
}
Поэтому мне нужно настроить его таким образом, чтобы протокол любого посыла библиотеки, доступной на декларативном уровне:
interface Test<P> {
funcName():P<string>;
}
Но машинописи сразу жалуется: 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 только в качестве примера, как мне нужно решение поддержать любую библиотеку обещание, а не один конкретный.
Почему 'Test', разве это не должно быть 'Test '? –
Bergi
@Bergi, который сообщает компилятору относиться к переменной как к классу. Но это не имеет значения, потому что ошибка возникает перед этим вызовом, при анализе класса 'Test'. Я обновил вопрос;) –
Вам нужно определить структурный интерфейс 'then'able, хотя я думаю, что bluebird будет структурно передаваться как обещание ES2015, поскольку он имеет точно такие же сигнатуры функций. –