interface Window {
AudioContext: AudioContext;
webkitAudioContext: Function
}
let contextClass = window.AudioContext || window.webkitAudioContext;
let context: AudioContext = new contextClass();
The last line is giving me this error,
Cannot use 'new' with an expression whose type lacks a call or construct signature
How can I resolve this?
The problem is that the compiler treats the contextClass variable as an instance of AudioContext while in fact it's merely a constructor function for an AudioContext.
You can simply use any and the compiler will let you new it:
let contextClass : any = window.AudioContext || window.webkitAudioContext;
let context: AudioContext = new contextClass();
Another option would be to introduce a Constructable<T> interface that will let you new up those types:
interface Constructable<T> {
new(...args: any) : T;
}
interface Window
{
AudioContext: Constructable<AudioContext>;
webkitAudioContext: Constructable<AudioContext>
}
let contextClass = window.AudioContext || window.webkitAudioContext;
let context: AudioContext = new contextClass();
You can't new up an instance. new instanceofAudioContext() isn't a valid thing to do.
Your interface doesn't match the API you're trying to use. In the browser, window.AudioContext isn't a instance of AudioContext. It's the class definition method, typeof AudioContext. You'll also have the same problem with the Function.
If you'd still like to keep your interface. Try this
interface Window {
AudioContext: typeof AudioContext;
webkitAudioContext: typeof AudioContext
}
declare var window: Window;
var AudioContextDecl = window.AudioContext || window.webkitAudioContext;
var audioCtx = new AudioContext();
Or if you don't want the interface,
var AudioContextDecl = <typeof AudioContext>(window.AudioContext || window.webkitAudioContext);
var audioCtx = new AudioContext();
Or even just use any. It all transpiles to the same thing.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With