【问题标题】:Pass class as generic parameter Typescript将类作为通用参数 Typescript 传递
【发布时间】:2018-11-07 14:17:54
【问题描述】:

我试图实例化一个作为参数传递给另一个类的实例,我在一个文件 ImportedClass.ts 中有这个:

export default class ImportedClass {
  public constructor(something: any) {
  }
  public async exampleMethod() {
    return "hey";
  }
}

这在另一个,InstanceClass.ts:

interface GenericInterface<T> {
  new(something: any): T;
}

export default class InstanceClass <T> {
  private c: GenericInterface<T>;
  public constructor(c: T) {
  }
  async work() {
    const instanceTry = new this.c("hello");
    instanceTry.exampleMethod();
  }
}

这在另一个 ClassCaller.ts 中:

import ImportedClass from './ImportedClass';
import ImportedClass from './InstanceClass';

const simulator = new InstanceClass <ImportedClass>(ImportedClass);

然后当我这样称呼它时:

simulator.work();

它抛出这个错误:

error TS2339: Property 'exampleMethod' does not exist on type 'T'.

欢迎任何帮助,谢谢。

【问题讨论】:

    标签: javascript typescript class generics


    【解决方案1】:

    如果T 必须有一个名为exampleMethod 的方法,则必须将其包含在Simulator 上的T 的约束中,才能在Simulator 中使用它:

    export class ImportedClass {
        public constructor(something: any) {
        }
        public async exampleMethod() {
            return "hey";
        }
    }
    
    interface GenericInterface<T> {
        new(something: any): T;
    }
    
    export class Simulator<T extends { exampleMethod(): Promise<string> }> {
        public constructor(private c: GenericInterface<T>) {
        }
        async work() {
            const instanceTry = new this.c("hello");
            await instanceTry.exampleMethod();
        }
    }
    const simulator = new Simulator(ImportedClass);
    simulator.work()
    

    Playground link

    还有其他一些小问题需要修复才能使上面的 sn-p 工作,但这是 mai 问题。

    【讨论】:

    • 感谢您的回答, 我扩展了它,但仍然收到此错误:TS2345:“typeof ImportedClass”类型的参数不可分配给“{ exampleMethod”类型的参数(): 任何; }'。 “typeof ImportedClass”类型中缺少属性“exampleMethod”。再次感谢。
    • @user3314345 您对Simulator 的构造函数的参数是T,您希望它成为构造函数(GenericInterface&lt;T&gt;),请查看我的示例代码和操场链接。
    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2019-04-20
    相关资源
    最近更新 更多