web-dev-qa-db-ja.com

Typescriptインターフェースのジェネリック型をチェック

私のangular 6ファイルで、インターフェイスを定義してから、ジェネリックパラメーターTを受け取るメソッドで、Tが実行時にそのインターフェイスを実装するかどうかを確認します。それは可能ですか?

if (T instanceof INetworkObject)を実行しようとしましたが、コンパイラはそれを好みません。

export interface INetworkObject {
    fixNetworkObject(): void;
}

protected getTypedItem<T>(endpoint: string, C: { new(): T }): Observable<T> {
    return this.http.get<T>(`${this.baseUrl}/${endpoint}`)
        .pipe(map(element => {
            if (!element) {
                return null;
            }

            const ret = Object.assign(new C(), element);

            if (T.type instanceof NetworkObject) {

            }

            // This ugliness is what I'm doing now
            if (typeof ret['fixNetworkObject'] === 'function') {
                ret['fixNetworkObject']();
            }

基本的に私がやろうとしていることは、fixNetworkObjectretを呼び出すことです。

4
Gargoyle

残念ながら、ランタイムにはインターフェイスが存在しないため、instanceofは使用できません。そのようにタイプガードを宣言する必要があります( 高度なタイプのドキュメント を参照):

function isINetworkObject(obj: any): obj is INetworkObject {
  return typeof ret.fixNetworkObject === 'function';
}

次にifを変更します。

if (isINetworkObkect(ret)) {
  ret.fixNetworkObject();
}
5
morsecodist