如何使用“ typeof”从泛型类获取类型?

迈克尔·李

当我宣布一个泛型类Aa.js,并出口it.Then,我不知道如何声明类的变量Ab.js

代码如下a.js

export let A = function<K extends { value: number }>(DEFAULT_NUMBER){
    return class A<T> {
    test(obj: T, num: number): K {
        return obj.diff(DEFAULT_NUMBER, num);
    };
    };
}(
    // DEFAULT_NUMBER
    1000
);

b.js

import { A } from "a.js";

class B {
    diff(): { value: number } {
        // ...
    }
};

let a: InstanceType<typeof A<B>> = new A();

a.test(new B(), 50);

下面的简单代码:

let A = class<T> {};

class B {};

let a: InstanceType<typeof A<B>>; // throw a syntax error
// or
let a: InstanceType<(typeof A)<B>>; // throw a syntax error
// or
let a: InstanceType<typeof (A<B>)>; // throw a syntax error
// or
let a: (InstanceType<typeof A>)<B>; // throw a syntax error
// or
let a: InstanceType<typeof A>; // correct, but the type of a is `A<unknown>`

我应该如何声明变量a

迈克尔·李

我在两天内一直在考虑这个问题,最后,我找到了答案,代码如下:

type ReplaceItemTypeOf<Target extends any[], NewType, OldType = unknown> = {
    // for each item of the array
    [Key in keyof Target]: (
        // if the type is matched, return NewTypeNewType, otherwise return the origin type of the item value
        OldType extends Target[Key] ? NewType : Target[Key]
    );
};

type NonAnyType<T> = (T & 1 extends 1 ? 1 : 0) extends 1 ? T : never;

type InstanceTypeOfGenericRef<GenericRef extends new(...args: any) => any, Type> = {
    // for each property
    [Key in keyof InstanceType<GenericRef>]: (
        // if the type is matched unknown type or empty object type
        {} extends (
            // if property is a method
            InstanceType<GenericRef>[Key] extends (...args: any) => infer Result ?
                // if type of Result is any return never, otherwise return the origin type of Result
                NonAnyType<Result> :
                // if type of the property value is any return never, otherwise return the origin type of the property value
                NonAnyType<InstanceType<GenericRef>[Key]>
        ) ?
            (
                // if property is a method, and type has matched
                InstanceType<GenericRef>[Key] extends (...args: infer Args) => infer Result ?
                    // return a new method interface which has replaced argument types
                    (...args: ReplaceItemTypeOf<Args, Type>) => Type :
                    // if not a method, return Type
                    Type
            ) :
            (
                // if property is a method and type has not matched
                InstanceType<GenericRef>[Key] extends (...args: infer Args) => infer Result ?
                    // return a new method interface which has replaced argument types
                    (...args: ReplaceItemTypeOf<Args, Type>) => Result :
                    // return origin type of the property value
                    InstanceType<GenericRef>[Key]
            )
    );
};

let A = class A<T> {
    set(value: T): T {
        return value;
    }
}

let a: InstanceTypeOfGenericRef<typeof A, string>;

a.set("123");

下面的屏幕截图: 在此处输入图片说明

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用类的实例获取类的泛型类型参数的数量?

来自分类Dev

如何使用泛型返回泛型类的类类型?

来自分类Dev

如何使用类型的辅助类泛型

来自分类Dev

如何在泛型方法中获取泛型类型的类实例

来自分类Dev

如何从具有基本类型约束的泛型方法获取typeof(T)?

来自分类Dev

如何在类中使用扩展的泛型类型的类型?

来自分类Dev

如何为泛型类指定泛型集合类型?

来自分类Dev

泛型-使用父类在泛型中指定类型

来自分类Dev

为使用泛型类型的typeof值的函数定义接口

来自分类Dev

如何返回泛型类型的类

来自分类Dev

如何定义不是类的泛型类型?

来自分类Dev

在泛型类中使用匿名类型

来自分类Dev

使用类对象作为泛型类型

来自分类Dev

使用类实例作为泛型类型

来自分类Dev

使用泛型替换特定的类类型

来自分类Dev

使用类泛型构造的子类型

来自分类Dev

如何获取嵌套的泛型类型

来自分类Dev

如何使用泛型类型声明类 - Java 1.7

来自分类Dev

使用泛型从对象获取原始类型

来自分类Dev

获取抽象超类中使用的泛型类型的属性而不使用接口?

来自分类Dev

使用泛型获取类的实例

来自分类Dev

Java:如何从泛型类型对象实例获取枚举类的值?

来自分类Dev

如何获取在数组的方法中使用的泛型类型?

来自分类Dev

泛型:使用super时如何获取类型以供重用?

来自分类Dev

如何使用Java Reflectionioin获取列表的泛型类?

来自分类Dev

如何使用类标记保留嵌套泛型的泛型类型

来自分类Dev

如何在非泛型静态类的多个方法中使用相同的泛型类型

来自分类Dev

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

来自分类Dev

Java泛型:如何为泛型类型化的类指定类类型?

Related 相关文章

  1. 1

    使用类的实例获取类的泛型类型参数的数量?

  2. 2

    如何使用泛型返回泛型类的类类型?

  3. 3

    如何使用类型的辅助类泛型

  4. 4

    如何在泛型方法中获取泛型类型的类实例

  5. 5

    如何从具有基本类型约束的泛型方法获取typeof(T)?

  6. 6

    如何在类中使用扩展的泛型类型的类型?

  7. 7

    如何为泛型类指定泛型集合类型?

  8. 8

    泛型-使用父类在泛型中指定类型

  9. 9

    为使用泛型类型的typeof值的函数定义接口

  10. 10

    如何返回泛型类型的类

  11. 11

    如何定义不是类的泛型类型?

  12. 12

    在泛型类中使用匿名类型

  13. 13

    使用类对象作为泛型类型

  14. 14

    使用类实例作为泛型类型

  15. 15

    使用泛型替换特定的类类型

  16. 16

    使用类泛型构造的子类型

  17. 17

    如何获取嵌套的泛型类型

  18. 18

    如何使用泛型类型声明类 - Java 1.7

  19. 19

    使用泛型从对象获取原始类型

  20. 20

    获取抽象超类中使用的泛型类型的属性而不使用接口?

  21. 21

    使用泛型获取类的实例

  22. 22

    Java:如何从泛型类型对象实例获取枚举类的值?

  23. 23

    如何获取在数组的方法中使用的泛型类型?

  24. 24

    泛型:使用super时如何获取类型以供重用?

  25. 25

    如何使用Java Reflectionioin获取列表的泛型类?

  26. 26

    如何使用类标记保留嵌套泛型的泛型类型

  27. 27

    如何在非泛型静态类的多个方法中使用相同的泛型类型

  28. 28

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

  29. 29

    Java泛型:如何为泛型类型化的类指定类类型?

热门标签

归档