从打字稿中的通用类型调用通用类型的静态函数

米妮

我在服务类中有一个函数,该函数传递了扩展我的 Bean 类的泛型类型。我希望函数调用 Bean 类中的静态函数来创建一个 Bean 数组。我在操场上的代码可以编译,但是我收到运行时浏览器错误

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);

操场上的代码

谢谢。

OJ权

在您的 param 定义中get_entry_list,它只定义了 ctor 的类型但缺少静态方法接口,因此访问它会引发编译错误,而运行时可以正确访问这些属性。

您可以定义构造函数接口,

interface XXX<T> {
  new(p: number): T;
  fromEntryList<U>(ctor: new (p: number) => U, numbers: Array<number>): Array<U>;
}

这基本上是Bean然后将其用于参数签名的表示

get_entry_list<T extends Bean>(ctor: XXX<T>): Array<T>

允许 get_entry_list 中提供的 ctor 可以访问静态方法。

操场:

https://www.typescriptlang.org/play/#src=%2F%2F%20Base%20class%20that%20will%20be%20extended%0D%0Aclass%20Bean%20%7B%0D%0A%20%20id% 3A%20number%3B%0D%0A%0D%0A%20%20static%20fromEntryList%3CT1%3E(ctor%3A%20new%20(p%3A%20number)%20%3D%3E%20T1%2C%20numbers %3A%20Array%3Cnumber%3E)%3A%20Array%3CT1%3E%20%7B%0D%0A%0D%0A%20%20%20%20%20%20let%20result%3A%20Array%3CT1% 3E%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20for%20(let%20anumber%20of%20numbers)%20%7B%0D%0A%20 %20%20%20%20%20%20%20%20%20result.push(new%20ctor(anumber))%3B%0D%0A%20%20%20%20%20%20%7D%0D %0A%20%20%20%20%20%20return%20result%3B%0D%0A%20%20%7D%0D%0A%0D%0A%0D%0A%20%20构造函数(p%3A%20number )%20%7B%0D%0A%20%20%20%20%20%20这个。id%20%3D%20p%3B%0D%0A%20%20%7D%0D%0A%7D%0D%0A%0D%0Ainterface%20XXX%3CT%3E%20%7B%0D%0A%20% 20new(p%3A%20number)%3A%20T%3B%0D%0A%20%20fromEntryList%3CU%3E(ctor%3A%20new%20(p%3A%20number)%20%3D%3E%20U% 2C%20numbers%3A%20Array%3Cnumber%3E)%3A%20Array%3CU%3E%3B%0D%0A%7D%0D%0A%0D%0A%2F%2F%20Base%20service%20class%20that%20will %20be%20extended%0D%0Aclass%20BeanService%20%7B%0D%0A%0D%0A%0D%0A%20%20constructor()%20%7B%20%7D%0D%0A%0D%0A%20 %20get_entry_list%3CT%20extends%20Bean%3E(ctor%3A%20XXX%3CT%3E)%3A%20Array%3CT%3E%20%7B%0D%0A%20%20%20%20%20%20let% 20x%3A%20T%5B%5D%20%3D%20ctor.fromEntryList(ctor%2C%20%5B1%2C%202%2C%203%2C%204%5D)%3B%0D%0A%20%20 %20%20%20%20return%20x%3B%0D%0A%20%20%7D%0D%0A%7D%0D%0A%0D%0Alet%20service%20%3D%20new%20BeanService()%3B %0D%0Alet%20beans%3A%20Bean%5B%5D%20%3D%20service.get_entry_list(Bean)%3B%0D%0A%0D%0Aconsole.log(beans)%3B日志(豆类)%3B日志(豆类)%3B日志(豆类)%3B日志(豆类)%3B日志(豆类)%3B日志(豆类)%3B日志(豆类)%3B日志(豆类)%3B

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

枚举作为打字稿中的通用类型

来自分类Dev

从打字稿中的非静态函数访问静态成员

来自分类Dev

如何从打字稿中的静态函数访问非静态属性

来自分类Dev

打字稿通用类型断言

来自分类Dev

通用api类型的打字稿?

来自分类Dev

从打字稿中相同类的实例方法中简短引用静态函数

来自分类Dev

打字稿:通用函数类型转换所有函数参数

来自分类Dev

在打字稿中抽象出通用类型参数

来自分类Dev

从打字稿中的扩展类返回通用值

来自分类Dev

打字稿,类型对象不是通用的

来自分类Dev

打字稿无法推断通用类型

来自分类Dev

打字稿:通用类类型推断

来自分类Dev

在类型数组上调用静态函数

来自分类Dev

打字稿:基于预期收益类型的约束函数通用类型

来自分类Dev

打字稿:如何为通用类型定义对象键的类型

来自分类Dev

如何从打字稿中的类数组中解开类型

来自分类Dev

如何以通用方式在协议上调用静态函数?

来自分类Dev

如何从打字稿中的类中提取类型?

来自分类Dev

Redux传奇使用带有通用函数类型打字稿的Call效果

来自分类Dev

导入静态函数打字稿

来自分类Dev

通用函数中的属性类型

来自分类Dev

打字稿:强制默认通用类型为“任意”而不是“ {}”

来自分类Dev

打字稿通用类型参数:T vs T扩展{}

来自分类Dev

无法使用打字稿为通用比较功能定义类型

来自分类Dev

具有隐式属性类型的通用打字稿

来自分类Dev

打字稿通用类型和未定义

来自分类Dev

打字稿:如何确保通用类型是JSON的子集?

来自分类Dev

从打字稿中的部分对象中过滤通用列表

来自分类Dev

有什么方法可以在打字稿中实例化通用文字类型?

Related 相关文章

热门标签

归档