html - HTMLAudioElement som JS-ljud


Jag har ett ljud som jag laddar med HTML:

<audio>
    <source src="file.ogg" />
    <source src="file.mp3" />
</audio>

Jag har också utökat prototypen för att skapa en ny funktion:

Audio.prototype.restart = function(){
    this.pause();
    this.currentTime = 0;
    this.play();
}

Men när jag hämtar audioelementet, känner TypeScript inte igen det som en instans av Audio:

let file = document.querySelector("audio")! as Audio;

file.restart()

Jag får två fel:

'Audio' refererar till ett värde, men används här som en typ. Menade du 'typeof Audio'?ts(2749)

Egenskapen 'restart' finns inte på typen 'HTMLAudioElement'.ts(2339)

Hur fixar jag detta?

Svar #1

Du behöver

  • Berätta för TS att en restart-funktion nu finns på HTMLAudioElements
  • Berätta för TS att querySelector('audio') kommer att returnera ett HTMLAudioElement, vilket kan göras med generics
interface HTMLAudioElement {
    restart: () => void;
}
Audio.prototype.restart = function(){
    this.pause();
    this.currentTime = 0;
    this.play();
}
let file = document.querySelector<HTMLAudioElement>("audio")!;

file.restart()

'Audio' hänvisar till ett värde, men används här som en typ.

kommer upp eftersom Audio är en konstruktor - ett värde.

console.log(typeof Audio);