interface Window {
AudioContext: AudioContext;
webkitAudioContext: Function
}
let contextClass = window.AudioContext || window.webkitAudioContext;
let context: AudioContext = new contextClass();
最后一行是给我这个错误,
不能对类型缺少调用的表达式使用'new' 构建签名
我该如何解决这个问题?
答案 0 :(得分:13)
问题是编译器将contextClass
变量视为AudioContext
的实例,而实际上它只是AudioContext
的构造函数。
你可以简单地使用any
,编译器会让你new
:
let contextClass : any = window.AudioContext || window.webkitAudioContext;
let context: AudioContext = new contextClass();
另一个选择是引入一个Constructable<T>
界面,让new
提升这些类型:
interface Constructable<T> {
new() : T;
}
interface Window
{
AudioContext: Constructable<AudioContext>;
webkitAudioContext: Constructable<AudioContext>
}
let contextClass = window.AudioContext || window.webkitAudioContext;
let context: AudioContext = new contextClass();
答案 1 :(得分:6)
您无法新建实例。 new instanceofAudioContext()
不是一件有效的事情。
您的界面与您尝试使用的API不匹配。在浏览器中,window.AudioContext
不是AudioContext
的实例。它是类定义方法typeof AudioContext
。您对Function
也有同样的问题。
如果您仍想保留自己的界面。试试这个
interface Window {
AudioContext: typeof AudioContext;
webkitAudioContext: typeof AudioContext
}
declare var window: Window;
var AudioContextDecl = window.AudioContext || window.webkitAudioContext;
var audioCtx = new AudioContext();
或者,如果您不想要界面,
var AudioContextDecl = <typeof AudioContext>(window.AudioContext || window.webkitAudioContext);
var audioCtx = new AudioContext();
甚至只使用any
。这一切都转化为同样的事情。
答案 2 :(得分:0)
在此处尝试typeof
declare global {
interface Window {
AudioContext: typeof AudioContext;
webkitAudioContext: Function;
}
}
let contextClass = window.AudioContext || window.webkitAudioContext;
let context: AudioContext = new contextClass();