我在服务类中有一个函数,它传递了扩展我的Bean类的泛型类型。我希望函数在Bean类中调用静态函数来创建Beans数组。我在操场上的代码编译,但是我得到了
的运行时浏览器错误Uncaught TypeError: ctor.constructor.fromEntryList is not a function
如果我删除.constructor
我得到了创建的bean数组,但是有一个没有.constructor
的打字稿错误。
我迷失了如何正确地打字编码这个功能。任何帮助都非常感谢,因为我在SO上找不到先前的答案。
代码:
// Base class that will be extended
class Bean {
id: number;
static fromEntryList<T1>(ctor: new (p: number) => T1, numbers: Array<number>): Array<T1> {
let result: Array<T1> = [];
for (let anumber of numbers) {
result.push(new ctor(anumber));
}
return result;
}
constructor(p: number) {
this.id = p;
}
}
// Base service class that will be extended
class BeanService {
constructor() { }
get_entry_list<T extends Bean>(ctor: new (p: number) => T): T[] {
let x: T[] = (<typeof Bean>ctor.constructor).fromEntryList(ctor, [1, 2, 3, 4]);
return x;
}
}
let service = new BeanService();
let beans: Bean[] = service.get_entry_list(Bean);
感谢。
答案 0 :(得分:2)
在get_entry_list
的param定义中,它只定义了ctor的类型但缺少静态方法接口,因此访问它会引发编译错误,而运行时可以正确地访问这些属性。
您可以定义构造函数接口,
interface XXX<T> {
new(p: number): T;
fromEntryList<U>(ctor: new (p: number) => U, numbers: Array<number>): Array<U>;
}
基本上是Bean
的表示,然后将其用于param的签名
get_entry_list<T extends Bean>(ctor: XXX<T>): Array<T>
允许get_entry_list中提供的ctor可以访问静态方法。
游乐场: