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

VJA*_*JAI 17 typescript

interface Window {
    AudioContext: AudioContext;
    webkitAudioContext: Function
}

let contextClass = window.AudioContext || window.webkitAudioContext;
let context: AudioContext = new contextClass();
Run Code Online (Sandbox Code Playgroud)

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

不能对类型缺少调用或构造签名的表达式使用"new"

我该如何解决这个问题?

hai*_*770 18

问题是编译器将contextClass变量视为实例,AudioContext而实际上它只是一个构造函数AudioContext.

你可以简单地使用any,编译器会让你new:

let contextClass : any = window.AudioContext || window.webkitAudioContext;
let context: AudioContext = new contextClass();
Run Code Online (Sandbox Code Playgroud)

另一种选择是引入一个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();
Run Code Online (Sandbox Code Playgroud)


Nat*_*per 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();
Run Code Online (Sandbox Code Playgroud)

或者如果你不想要界面,

var AudioContextDecl = <typeof AudioContext>(window.AudioContext || window.webkitAudioContext);
var audioCtx = new AudioContext();
Run Code Online (Sandbox Code Playgroud)

甚至只是使用any.这一切都转化为同样的事情.