使用泛型和构造函数的 TypeScript 类型转换?

亚历山大·奥马拉

我有一个基类,以及那里的子类。

这些类的实例被放入具有基类类型的集合中。

class Type extends Object {
    public static ID = 'type';
    public id = 'type';
    constructor() { super(); }
}

class TypeA extends Type {
    public static ID = 'type-a';
    public id = 'type-a';
    constructor() { super(); }
    public onlyA() { return 'only A has this method'; }
}

class TypeB extends Type {
    public static ID = 'type-b';
    public id = 'type-b';
    constructor() { super(); }
    public onlyB() { return 'only B has this method'; }
}

// Discards subclass type information:
const list: Type[] = [
    new TypeA(),
    new TypeB()
];

// Has inferred type: Type
const list0 = list[0];

现在,如果我知道正确的类型,我可以as用来提升类型:

const list0asA = list0 as TypeA;
list0asA.onlyA();

然而,我想做的是创建一个通用函数,该函数将动态检查实例,并返回提升的类型或null它是否不匹配。

我想出了以下内容,但不太正确:

function castOrNull<
    C extends typeof Type
>(value: Type, Constructor: C): C | null {
    if (value.id !== Constructor.ID) {
        return null;
    }
    return value as C;
}

const list0castA = castOrNull(list0, TypeA);
if (list0castA) {
    list0asA.onlyA();
}

问题是我不是试图将变量转换为构造函数类型,而是该构造函数实例的类型,因此 as 和 return 类型不正确。

或者,这确实有效,但它需要显式设置泛型类型,这意味着在使用时指定类型两次,这不太理想。

function castOrNull<
    T extends Type
>(value: Type, Constructor: typeof Type): T | null {
    if (value.id !== Constructor.ID) {
        return null;
    }
    return value as T;
}

const list0upA = castOrNull<TypeA>(list0, TypeA);
if (list0castA) {
    list0asA.onlyA();
}

是否可以在不指定两次类型的情况下创建此泛型函数?

CRICE

从 Typescript 2.8 开始,该类型InstanceType<T>被添加到标准库中,它从构造函数类型中提取T其实例的类型。因此,对于您的代码段,您可以将其用于返回类型并进行转换:

function castOrNull<
    C extends typeof Type
>(value: Type, Constructor: C): InstanceType<C> | null {
    if (value.id !== Constructor.ID) {
        return null;
    }
    return value as InstanceType<C>;
}

// All good now
const list0castA = castOrNull(list0, TypeA);
if (list0castA) {
    list0asA.onlyA();
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从TypeScript中的泛型类型获取构造函数/实例

来自分类Dev

TypeScript 中泛型类型的返回构造函数

来自分类Dev

如何在TypeScript中使用泛型在重载函数中进行类型转换

来自分类Dev

Delphi泛型:无法将类和构造函数约束的泛型类型转换为接口

来自分类Dev

泛型类型的TypeScript函数重载

来自分类Dev

我可以告诉TypeScript泛型类型具有构造函数吗?

来自分类Dev

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

来自分类Dev

Typescript:泛型,使用泛型扩展类型

来自分类Dev

Typescript泛型:从函数参数的类型推断类型?

来自分类Dev

在 TypeScript 中将函数类型转换为这些函数的返回类型

来自分类Dev

使用构造函数自动装配泛型类型[Spring 4.2.5]

来自分类Dev

泛型类型推断的 Typescript 泛型

来自分类Dev

Typescript中的泛型转换

来自分类Dev

Typescript从具有泛型类型的对象索引调用函数

来自分类Dev

可以在引入其他泛型类型的泛型类上使用构造函数吗?

来自分类Dev

TypeScript中参数类型和泛型之间的区别

来自分类Dev

如何使泛型类型的构造函数

来自分类Dev

泛型类型作为构造函数参数

来自分类Dev

如何使泛型对象使用在Typescript中使用一个类型或void的两个函数的函数参数

来自分类Dev

如何在函数调用中使用Typescript泛型类构造函数作为参数

来自分类Dev

泛型类型的转换

来自分类Dev

转换泛型类型

来自分类Dev

如何使用泛型缩小TypeScript联合类型

来自分类Dev

Typescript编译器使用泛型推断类型

来自分类Dev

TypeScript - 使用泛型创建自定义类型

来自分类Dev

使用 TypeScript checkJs 在 JSDoc 中扩展泛型类型的方法?

来自分类Dev

TypeScript构造函数类型安全

来自分类Dev

Typescript泛型是否使用类型擦除来实现泛型?

来自分类Dev

使用类泛型构造的子类型

Related 相关文章

  1. 1

    从TypeScript中的泛型类型获取构造函数/实例

  2. 2

    TypeScript 中泛型类型的返回构造函数

  3. 3

    如何在TypeScript中使用泛型在重载函数中进行类型转换

  4. 4

    Delphi泛型:无法将类和构造函数约束的泛型类型转换为接口

  5. 5

    泛型类型的TypeScript函数重载

  6. 6

    我可以告诉TypeScript泛型类型具有构造函数吗?

  7. 7

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

  8. 8

    Typescript:泛型,使用泛型扩展类型

  9. 9

    Typescript泛型:从函数参数的类型推断类型?

  10. 10

    在 TypeScript 中将函数类型转换为这些函数的返回类型

  11. 11

    使用构造函数自动装配泛型类型[Spring 4.2.5]

  12. 12

    泛型类型推断的 Typescript 泛型

  13. 13

    Typescript中的泛型转换

  14. 14

    Typescript从具有泛型类型的对象索引调用函数

  15. 15

    可以在引入其他泛型类型的泛型类上使用构造函数吗?

  16. 16

    TypeScript中参数类型和泛型之间的区别

  17. 17

    如何使泛型类型的构造函数

  18. 18

    泛型类型作为构造函数参数

  19. 19

    如何使泛型对象使用在Typescript中使用一个类型或void的两个函数的函数参数

  20. 20

    如何在函数调用中使用Typescript泛型类构造函数作为参数

  21. 21

    泛型类型的转换

  22. 22

    转换泛型类型

  23. 23

    如何使用泛型缩小TypeScript联合类型

  24. 24

    Typescript编译器使用泛型推断类型

  25. 25

    TypeScript - 使用泛型创建自定义类型

  26. 26

    使用 TypeScript checkJs 在 JSDoc 中扩展泛型类型的方法?

  27. 27

    TypeScript构造函数类型安全

  28. 28

    Typescript泛型是否使用类型擦除来实现泛型?

  29. 29

    使用类泛型构造的子类型

热门标签

归档