Typescript - 可以将泛型类型作为参数而不使用泛型元素吗?

时间:2017-04-23 15:38:57

标签: generics typescript proxy

我希望能够在没有泛型的情况下访问泛型类型....这可能吗?

如果我有通用接口,例如

interface GenIntf<T1, T2> {
  someGenFunct(param: P1): T2;
}

我有一个工厂类,其工作是创建代理someGenFunct:

class ProxyFactory {
  create(genIntf: GenIntf): any {
    return new Proxy(genIntf.someGenFunct, {});
  }
}

所以在这里我不希望工厂知道关于GenIntf​​的泛型类型的任何信息,我只想确保提供GenIntf​​的实现。但除非我将其改为

,否则这将失败
create<A, B>(genIntf: GenIntf<A, B>) {

但是这更难以抽象地使用。

1 个答案:

答案 0 :(得分:0)

您可以在类型参数中使用any类型:

class ProxyFactory {
  create(genIntf: GenIntf<any, any>): any {
    return new Proxy(genIntf.someGenFunct, {});
  }
}

旁注:您可能不希望使用any返回类型,因为应该避免它们以防止错误地使用返回值。我复制并将其保留为问题中的代码。

总的来说,最好是按照你在问题中建议的那样做:

class ProxyFactory {
  create<A, B>(genIntf: GenIntf<A, B>) {
    return new Proxy(genIntf.someGenFunct, {});
  }
}

const genIntf = ...;
const proxyFactory = new ProxyFactory();
const proxy = proxyFactory.create(genIntf);

默认类型参数

TS 2.3+中,您可以考虑使用默认类型参数:

interface GenIntf<T1 = any, T2 = any> {
  someGenFunct(param: T1): T2;
}

但是这会影响界面本身,这可能不是你想要的。