不能使用new与表达式打字稿

时间:2016-12-07 12:16:59

标签: typescript

interface Window {
    AudioContext: AudioContext;
    webkitAudioContext: Function
}

let contextClass = window.AudioContext || window.webkitAudioContext;
let context: AudioContext = new contextClass();

最后一行是给我这个错误,

  

不能对类型缺少调用的表达式使用'new'   构建签名

我该如何解决这个问题?

3 个答案:

答案 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();