#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> здесь не будет работать. Большое вам спасибо 🙂