打字稿检查接口的通用类型

时间:2018-07-19 05:29:21

标签: typescript typescript-generics

在我的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(如果它实现了该接口)。

1 个答案:

答案 0 :(得分:4)

不幸的是,您不能使用instanceof,因为接口在运行时不存在。您需要像这样声明类型保护(请参见Advanced Types Documentation):

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

然后修改您的条件:

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