2016-12-07 6 views
2
interface Window { 
    AudioContext: AudioContext; 
    webkitAudioContext: Function 
} 

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

最後の行は、私は、このエラーを与えているとの新しい使用することはできませんは、表現typescriptです

は、そのタイプのコールまたは 構造の署名を欠い式で「新しい」を使用することはできません

どうすれば解決できますか?

答えて

3

問題は、実際に、それは単にAudioContextのコンストラクター関数ですしながら、コンパイラがAudioContextインスタンスとしてcontextClass変数を扱うということです。

あなたは、単にanyを使用することができますし、コンパイラはあなたにnewをできるようになること:

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

別のオプションは、これらのタイプまで、あなたにnewを聞かせますConstructable<T>インターフェースを導入することです:

interface Constructable<T> { 
    new() : T; 
} 

interface Window 
{ 
    AudioContext: Constructable<AudioContext>; 
    webkitAudioContext: Constructable<AudioContext> 
} 

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

汎用インターフェースを必要としますか? – VJAI

+0

@マーク、いいえ、他のタイプにも役立つと思っています。あなたは安全に 'interface Constructable {new():AudioContext;で置き換えることができます。 } '。あるいは、これを 'ConstructableAudioContext'に名前変更したいのですが、これはもはや一般的でなく、' AudioContext'に特有なものではありません。 – haim770

1

インスタンスを新規に作成することはできません。 new instanceofAudioContext()は有効なものではありません。

あなたのインターフェイスは、使用しようとしているAPIと一致しません。ブラウザでwindow.AudioContextAudioContextのインスタンスではありません。それはクラス定義メソッド、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を使用し、インタフェースを使用しない場合を試してみてください。それはすべて同じことに変わります。

+1

を ' var AudioContext'は 'window.AudioContext'と衝突します... – haim770