私の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']();
}
基本的に私がやろうとしていることは、fixNetworkObject
がret
を呼び出すことです。
残念ながら、ランタイムにはインターフェイスが存在しないため、instanceof
は使用できません。そのようにタイプガードを宣言する必要があります( 高度なタイプのドキュメント を参照):
function isINetworkObject(obj: any): obj is INetworkObject {
return typeof ret.fixNetworkObject === 'function';
}
次にifを変更します。
if (isINetworkObkect(ret)) {
ret.fixNetworkObject();
}