Как я могу объявить window.Обещаю, когда у меня есть правильное объявление обещания?

#typescript

#машинописный текст

Вопрос:

Я загрузил объявление типа Promise для TypeScript из DefinitelyTyped, и теперь у меня правильно есть объявление Promise. Теперь мне нужно получить доступ к window.Пообещайте проверить поддержку Promise в браузерах. Я не могу этого сделать, потому что окно.Свойство Promise здесь не объявлено, в то время как Promise объявлено. Таким образом, я попытался заявить об этом сам:

 interface Window {
    Promise: typeof Promise;
}
 

Так вот, есть одна проблема. «Обещание» в typeof Promise на самом деле относится к Window.Обещание, а не объявление обещания, так что тип обещания теперь <любой>, чего я не хочу.

Как я могу правильно объявить окно.Обещаешь здесь?

Ответ №1:

Я не могу этого сделать, потому что window.Свойство Promise здесь не объявлено, в то время как Promise

Вы можете проверить Promise при window использовании :

 if(window['Promise'] === undefined){
    // no support
}
 

«Обещание» в typeof Promise на самом деле относится к Window .Обещание, а не объявление обещания

Вам необходимо получить доступ к определению глобальной области из локальной области. И TypeScript переходит в локальную область, вы, вероятно, ищете что-то вроде этого (обратите внимание на временную переменную foo):

 declare module Promise{export var mem:number;}

var foo:typeof Promise;
interface Window {
    Promise: typeof foo;
}

window.Promise.mem = 123; // okay 
 

Комментарии:

1. Я был бы более счастлив, если бы TS автоматически определял окно. Обещайте, если у нас есть определение обещания. Некоторые функции, включая window.setImmediate, определены глобально, но не определены в Window interface, который является глобальным. В любом случае, в данный момент я должен последовать вашему предложению. Спасибо вам 🙂

2. @KagamiSaschaRosylight исправляет ли обновление это для вас? … см . : github.com/borisyankov/DefinitelyTyped/blob/master/es6-promises /…

3. Отлично, это хорошо работает! Однако тип foo должен быть typeof Promise , поскольку TS требует аргументов типа в универсальных типах (определение DefinitelyTyped type объявляет Promise как универсальный тип), и простое обещание<any> здесь не будет работать. Большое вам спасибо 🙂