2016-12-17 6 views
0

Emscripten組み込みモジュールのTypescript宣言ファイルで作業しています。モジュールを使用して拡張されたクラスに対して、適切なコンストラクターのオートコンプリートを取得しようとしています。 Interface.extend。私は、複数のプロトタイプインタフェースのいずれかを(オーバーロードによって)拡張する必要がある汎用パラメータTを持っています。これは、Tが拡張するべきインタフェースと同一である限り、これは機能します。入力(T)にプロパティを追加するたびに失敗します。私は、TがUを拡張すると思ったのは、Uのすべてをサポートしている限り、どんなインターフェースでも許可していましたが、明らかにそのようには動作しません。Typescript:Emscriptenの宣言を書くのが難しいです。Embend Module.Interface.Extend

これは宣言です:

interface ILoggerPrototypeBase { 
    write(level: LogLevel, message: string); 
    __destruct__?(); 
} 
interface ILoggerPrototype extends ILoggerPrototypeBase { 
    __construct__?(); 
} 
interface ILoggerPrototype1<T1> extends ILoggerPrototypeBase { 
    __construct__?(a1: T1); 
} 
interface ILoggerPrototype2<T1, T2> extends ILoggerPrototypeBase { 
    __construct__?(a1: T1, a2: T2); 
} 
interface ILoggerPrototype3<T1, T2, T3> extends ILoggerPrototypeBase { 
    __construct__?(a1: T1, a2: T2, a3: T3); 
} 
class Logger { 
    write(logLevel: number, message: string); 

    static extend<T extends ILoggerPrototype>(name: string, loggerProto: T): { new(): Logger & T }; 
    static extend<T extends ILoggerPrototype1<T1>, T1>(name: string, loggerProto: T): { new(a1: T1): Logger & T }; 
    static extend<T extends ILoggerPrototype2<T1, T2>, T1, T2>(name: string, loggerProto: T): { new(arg1: T1, arg2: T2): Logger & T }; 
    static extend<T extends ILoggerPrototype3<T1, T2, T3>, T1, T2, T3>(name: string, loggerProto: T): { new(arg1: T1, arg2: T2, arg3: T3): Logger & T }; 
} 

私はその後、

const TestLogger = Logger.extend({ 
    __construct__(someString: string) {}, 
    write(logLevel: LogLevel, message: string) {}, 
    enableLogging() {}, 
    disableLogging() {} 
}) 

を行うことができます。しかし、私は、「オブジェクトリテラルを受けることを期待していたことは知られている唯一のプロパティを指定することと 『enableLogging』が存在しません。 in type ILoggerPrototype3 < {}、{}、{}> '

enableLoggingとdisableLoggingを削除すると正しいオーバーロードが検出され、機能しますが、 tは、ベースインタフェース(ILoggerPrototype ...)のコンストラクタを返すようにしたいが、T

UPDATE:私は、私が実際にインタフェースを定義し、明示的にテンプレート引数を指定する必要が実現するために来ているNitzan Tomerに感謝します。だから私のソリューションは、次のようにextendを使用することです:

interface ITestLogger extends cxg.ILoggerPrototype1<string> { 
    enableLogging(); 
    disableLogging(); 
} 

const TestLogger = cxg.Logger.extend<ITestLogger, string>('TestLogger', { 
    __construct__(someString: string) { 
    }, 
    enableLogging() { 
    }, 
    disableLogging() { 
    }, 
    write(level: cxg.LogLevel, message: string) { 
    } 
}); 

var logger = new TestLogger('hurray!'); 
+0

'enableLogging'と' disableLogging'はどこで定義されていますか?私はあなたが実際に広げようとした時以外は、それらの跡を見ない。 –

+0

これらは他で定義されていません。 'T extends ILoggerPrototype'を使うと、typescriptはILoggerPrototypeを拡張する独自のインターフェースを暗黙的に作成し、追加のプロパティーはその暗黙のインターフェースの一部になると期待していました。私はILoggerPrototype1 を拡張する別のインターフェイスITestLoggerを定義しようとしましたが、それにリテラルをキャストすると、期待通りに動作します。つまり、arg1は文字列ではなくオブジェクトです。私は文字列を入力として使うことができますが、オートコンプリートでは入力が文字列でなくオブジェクトでなければなりません。 –

+0

この 'ILoggerPrototype'とは何ですか?あなたはあなたの質問にそれを加えてください。その他の関連情報/コード。 –

答えて

0

私は明示的にプロトタイプのためのインタフェースを定義する必要があるという結論に来て、何を達成するために、明示的に定義されたジェネリック型引数を持つextendを呼び出しましたが欲しいです。つまり、私はこのようなextendを使用する必要があります

interface ITestLogger extends ILoggerPrototype1<string> { 
    enableLogging(); 
    disableLogging(); 
} 

const TestLogger = Logger.extend<ITestLogger, string>('TestLogger', { 
    __construct__(someString: string) { 
    }, 
    enableLogging() { 
    }, 
    disableLogging() { 
    }, 
    write(level: LogLevel, message: string) { 
    } 
}); 
関連する問題