我需要让打字稿停止抱怨我的代码。它在浏览器中运行良好,但全屏api尚未官方,因此打字稿定义不是最新的。
我正在调用document.documentElement.msRequestFullscreen。这会导致类型错误:
Property 'msRequestFullscreen' does not exist on type 'HTMLElement'.
看了lib.d.ts后,我发现了这个:
documentElement: HTMLElement;
因此,documentElement设置为输入HTMLElement。我尝试添加自定义定义来覆盖documentElement。我的自定义定义:
// Extend Document Typings
interface Document {
msExitFullscreen: any;
mozCancelFullScreen: any;
documentElement: {
msRequestFullscreen: any;
mozRequestFullScreen: any;
}
}
我尝试扩展Document的界面但是它给出了错误
错误是:
lib.d.ts:5704:5
Duplicate identifier 'documentElement'.
我的打字稿类
export class ToggleFullScreen {
viewFullScreenTriggerID: string;
viewFullScreenClass: string;
cancelFullScreenClass: string;
viewFullscreenElem: any;
activeIcon: string;
notFullscreenIcon: string;
isFullscreenIcon: string
constructor() {
this.viewFullScreenTriggerID = "#fullScreenTrigger";
this.viewFullScreenClass = "not-fullscreen";
this.cancelFullScreenClass = "is-fullscreen";
this.notFullscreenIcon = "/assets/icon/fullscreen-enter.svg";
this.isFullscreenIcon = "/assets/icon/fullscreen-exit.svg";
this.activeIcon = this.notFullscreenIcon;
}
toggleFullScreen() {
this.viewFullscreenElem = document.querySelector(this.viewFullScreenTriggerID);
if (this.viewFullscreenElem.classList.contains(this.viewFullScreenClass)) {
var docElm = document.documentElement;
if (docElm.requestFullscreen) {
docElm.requestFullscreen();
} else if (docElm.msRequestFullscreen) {
docElm.msRequestFullscreen();
} else if (docElm.mozRequestFullScreen) {
docElm.mozRequestFullScreen();
} else if (docElm.webkitRequestFullScreen) {
docElm.webkitRequestFullScreen();
}
this.viewFullscreenElem.classList.toggle(this.viewFullScreenClass);
this.viewFullscreenElem.classList.toggle(this.cancelFullScreenClass);
this.activeIcon = this.isFullscreenIcon;
}
else if (this.viewFullscreenElem.classList.contains(this.cancelFullScreenClass)) {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitCancelFullScreen) {
document.webkitCancelFullScreen();
}
this.viewFullscreenElem.classList.toggle(this.viewFullScreenClass);
this.viewFullscreenElem.classList.toggle(this.cancelFullScreenClass);
this.activeIcon = this.notFullscreenIcon;
}
}
}
什么是使打字稿编译错误停止的正确方法?
更新:我找到了解决方法。我没有尝试覆盖设置为HTMLElement类型的documentElement,而是扩展了HTMLElement并添加了缺少的属性。
// Extend Document Typings
interface Document {
msExitFullscreen: any;
mozCancelFullScreen: any;
}
interface HTMLElement {
msRequestFullscreen(): void;
mozRequestFullScreen(): void;
}
答案 0 :(得分:2)
我使用的是较新版本的Typescript,我遇到了同样的问题。
我尝试了上面的解决方案并且它没有工作 - 似乎我正在屏蔽现有的界面。
为了能够正确扩展两个接口,我不得不使用declare global:
declare global {
interface Document {
msExitFullscreen: any;
mozCancelFullScreen: any;
}
interface HTMLElement {
msRequestFullscreen: any;
mozRequestFullScreen: any;
}
}
这样做,我能够正确编译和使用这样的代码:
fullScreenClick(e): any {
var element = document.documentElement;
if (!$('body').hasClass("full-screen")) {
$('body').addClass("full-screen");
$('#fullscreen-toggler').addClass("active");
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.mozRequestFullScreen()) {
element.mozRequestFullScreen();
} else if (element.webkitRequestFullscreen) {
element.webkitRequestFullscreen();
} else if (element.msRequestFullscreen) {
element.msRequestFullscreen();
}
} else {
$('body').removeClass("full-screen");
$('#fullscreen-toggler').removeClass("active");
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
}
}
}
答案 1 :(得分:0)
您无法覆盖现有界面的现有属性,只能添加新界面。
根据您需要的MDN Using fullscreen mode和Element documentation:
Element.requestFullscreen()
lib.d.ts
和lib.es6.d.ts
中存在哪些内容。
如果您遗失msRequestFullscreen
和mozRequestFullScreen
,则需要将其添加到Element
:
interface Document {
msExitFullscreen: any;
mozCancelFullScreen: any;
}
interface Element {
msRequestFullscreen(): void;
mozRequestFullScreen(): void;
}
document.documentElement.mozRequestFullScreen(); // no error