在我的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
(如果它实现了该接口)。
答案 0 :(得分:4)
不幸的是,您不能使用instanceof
,因为接口在运行时不存在。您需要像这样声明类型保护(请参见Advanced Types Documentation):
function isINetworkObject(obj: any): obj is INetworkObject {
return typeof ret.fixNetworkObject === 'function';
}
然后修改您的条件:
if (isINetworkObkect(ret)) {
ret.fixNetworkObject();
}