具有类参数的泛型类型推断

安东尼·琼斯

我遇到一个问题,该问题是基于传入的类型来定义泛型。

我有一段代码“激活”一个类,我无法从类型参数中获取类型信息,所以我传入了类对象(而不是实例)。但是,这打破了类型推断。

这是我要执行的操作的简化示例:

interface IActivatable {
    id: number;
    name:string;
}

class ClassA implements IActivatable {
    public id: number;
    public name: string;
    public address:string;
}

class ClassB implements IActivatable {
    public id: number;
    public name: string;
    public age: number;
}

function activator<T extends IActivatable>(type:T): T {
    // do stuff to return new instance of T.
}

var classA:ClassA = activator(ClassA);

到目前为止,我唯一能想到的解决方案是将type参数的类型更改any并手动设置通用类型(如下所示)。但是,这似乎long之以鼻,还有另一种方法可以实现这一目标。

function activator<T extends IActivatable>(type:any): T {
    // do stuff to return new instance of T.
}

var classA:ClassA = activator<ClassA>(ClassA);

谢谢你提供的所有帮助。

芬顿

TypeScript中的类型信息在编译期间会全部删除,因此您不能直接使用任何通用类型,例如在运行时。

所以这就是你可以做的...

您可以通过将名称作为字符串传递来按名称创建类。是; 这涉及挥舞你的魔术弦。您还需要知道工具链中可能影响名称的所有内容,例如,任何粉碎器都会压碎名称(导致魔术字符串不同步):

class InstanceLoader<T> {
    constructor(private context: Object) {

    }

    getInstance(name: string, ...args: any[]) : T {
        var instance = Object.create(this.context[name].prototype);
        instance.constructor.apply(instance, args);
        return <T> instance;
    }
}

var loader = new InstanceLoader<IActivatable>(window);

var example = loader.getInstance('ClassA');

您还可以在运行时从实例中获取类型名称,我以下面的示例格式显示了该格式,该格式取自在运行时获取TypeScript类名称

class Describer {
    static getName(inputClass) { 
        var funcNameRegex = /function (.{1,})\(/;
        var results = (funcNameRegex).exec((<any> inputClass).constructor.toString());
        return (results && results.length > 1) ? results[1] : "";
    }
}

class Example {
}

class AnotherClass extends Example {
}

var x = new Example();
var y = new AnotherClass();

alert(Describer.getName(x)); // Example
alert(Describer.getName(y)); // AnotherClass

仅当您想生成“相同类型的另一个”(可以获取类型名称,然后使用对象创建的东西来获取另一个)时,这才有意义。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有多个类型参数的泛型推断类型

来自分类Dev

具有对其他类型参数的约束的类型参数的泛型推断

来自分类Dev

从参数推断泛型类型

来自分类Dev

使泛型类的函数仅接受具有相同泛型类型但受更多约束的参数

来自分类Dev

具有不同类型泛型参数的方法的泛型类

来自分类Dev

如何使用已知类型作为参数创建具有泛型的泛型类?

来自分类Dev

C#从具有约束的泛型推断类型

来自分类Dev

具有泛型的Scala类型类

来自分类Dev

具有接口类类型的泛型

来自分类Dev

Kotlin抽象类,具有泛型参数和使用类型参数的方法

来自分类Dev

TypeScript泛型:参数类型推断

来自分类Dev

泛型方法和泛型类中的类型推断

来自分类Dev

具有多个参数的泛型类中的从属类型约束

来自分类Dev

Kotlin 中具有两个类型参数的泛型类

来自分类Dev

具有继承的类类型的泛型列表的类

来自分类Dev

具有类的Haskell函数参数类型推断

来自分类Dev

从泛型推断类型

来自分类Dev

是否可以从 Typescript 中的非构造函数方法参数推断泛型类类型?

来自分类Dev

具有静态成员约束的泛型类型上的类型推断失败

来自分类Dev

目标类型具有通配符时的泛型方法类型推断

来自分类Dev

目标类型具有通配符时的泛型方法类型推断

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

C#泛型类作为参数,与泛型类的调用方法具有相同的T

来自分类Dev

C#泛型类作为参数,与泛型类的调用方法具有相同的T

来自分类Dev

具有类型依赖参数的 TypeScript 泛型方法

来自分类Dev

泛型类作为带有内部类型的参数

来自分类Dev

泛型类作为带有内部类型的参数

来自分类Dev

具有动态类型数量的泛型类

Related 相关文章

  1. 1

    具有多个类型参数的泛型推断类型

  2. 2

    具有对其他类型参数的约束的类型参数的泛型推断

  3. 3

    从参数推断泛型类型

  4. 4

    使泛型类的函数仅接受具有相同泛型类型但受更多约束的参数

  5. 5

    具有不同类型泛型参数的方法的泛型类

  6. 6

    如何使用已知类型作为参数创建具有泛型的泛型类?

  7. 7

    C#从具有约束的泛型推断类型

  8. 8

    具有泛型的Scala类型类

  9. 9

    具有接口类类型的泛型

  10. 10

    Kotlin抽象类,具有泛型参数和使用类型参数的方法

  11. 11

    TypeScript泛型:参数类型推断

  12. 12

    泛型方法和泛型类中的类型推断

  13. 13

    具有多个参数的泛型类中的从属类型约束

  14. 14

    Kotlin 中具有两个类型参数的泛型类

  15. 15

    具有继承的类类型的泛型列表的类

  16. 16

    具有类的Haskell函数参数类型推断

  17. 17

    从泛型推断类型

  18. 18

    是否可以从 Typescript 中的非构造函数方法参数推断泛型类类型?

  19. 19

    具有静态成员约束的泛型类型上的类型推断失败

  20. 20

    目标类型具有通配符时的泛型方法类型推断

  21. 21

    目标类型具有通配符时的泛型方法类型推断

  22. 22

    类中具有2个泛型类型的方法,其中1个泛型类型

  23. 23

    类中具有2个泛型类型的方法,其中1个泛型类型

  24. 24

    C#泛型类作为参数,与泛型类的调用方法具有相同的T

  25. 25

    C#泛型类作为参数,与泛型类的调用方法具有相同的T

  26. 26

    具有类型依赖参数的 TypeScript 泛型方法

  27. 27

    泛型类作为带有内部类型的参数

  28. 28

    泛型类作为带有内部类型的参数

  29. 29

    具有动态类型数量的泛型类

热门标签

归档