В Typescript я хочу иметь возможность определять тип Promise таким образом, чтобы я мог это сделать:
//This works today:
new Promise<number>((resolve)=>{
//Cool
resolve(5);
//Error, because I didn't pass a number:
resolve();
}
//This is what I want to do also:
new Promise<void>((resolve)=>{
//Error, because I passed a value:
resolve(5);
//Cool, because I declared the promise to be of type void, so resolve doesn't take a value:
resolve();
}
В файлах определения обещаний, которые я видел, все заявляют, что метод "решения" обещания должен принимать значение. Здесь - это недавний пример замечательного проекта DefinitelyTyped:
declare class Promise<R> implements Thenable<R> {
constructor(callback: (resolve : (result: R) => void, reject: (error: any) => void) => void);
///...
}
`` `
В основном это говорит: "Обратный вызов разрешения должен быть передан значение типа R." Это прекрасно для обещания вроде new Promise<number>
. Typescript проверит, что мы вызываем решение со значением типа number
.
Однако, если я хочу обещание, которое не имеет значения, поэтому я хочу, чтобы иметь возможность вызвать resolve() без передачи значения? Я могу объявить свое обещание следующим образом: new Promise<void>
Но тогда я все еще вынужден назвать решение и передать какую-то ценность. Я могу вызвать resolve(undefined)
, но это немного странно.
Кажется, нет способа правильно зафиксировать это понятие в Typescript: "Если этот общий тип имеет тип" void ", тогда не ожидайте параметра для этой функции."
Самое близкое, что я могу сделать, это отметить результат как необязательный в методе разрешения, но это будет означать, что результат всегда является необязательным даже для типизированных версий Promises.