在Typescript中是否有“Class”的类型?“any”是否包含它?

nfzehxib  于 2023-04-13  发布在  TypeScript
关注(0)|答案(8)|浏览(143)

在Java中,你可以使用类型“Class”给予一个class to a method作为一个参数。我在typescript文档中没有找到任何类似的东西--有可能将一个类传递给一个方法吗?如果有,类型“any”包括这样的类类型吗?
背景:Webstorm有一个问题,告诉我不能在Angular 2中将类交给@ViewChild(...)。但是,Typescript编译器没有抱怨。@ViewChild()的签名似乎是"Type<any> | Function | string",所以我想知道是否有包含类的。

agyaoht7

agyaoht71#

在typescript中,与你所要求的等价的是类型{ new(): Class },例如:

class A {}

function create(ctor: { new(): A }): A {
    return new ctor();
}

let a = create(A); // a is instanceof A

(code在操场上)
上面的代码只允许构造函数没有参数的类。

kcwpcxri

kcwpcxri2#

最简单的解决方案是let variable: typeof Class
下面是一个例子:

class A {
  public static attribute = "ABC";
}

function f(Param: typeof A) {
  Param.attribute;
  new Param();
}

f(A);
lztngnrs

lztngnrs3#

Angular在内部声明Type为:

export interface Type<T> extends Function { new (...args: any[]): T; }

使用TypeScript3应该可以添加types for arguments而不需要函数重载:

export interface TypeWithArgs<T, A extends any[]> extends Function { new(...args: A): T; }

示例:

class A {}

function create(ctor: Type<A>): A {
    return new ctor();
}

let a = create(A);
1mrurvl1

1mrurvl14#

是否有可能将一个类传递给一个方法?如果有,类型“any”是否包括这样的类类型?
any包括所有类型。
下面是一个只包含类的类型的示例:

type Class = { new(...args: any[]): any; };

然后使用它:

function myFunction(myClassParam: Class) {
}

class MyClass {}

myFunction(MyClass); // ok
myFunction({}); // error

你不应该在Function的类中传递一个错误,因为这应该可以正常工作:

var func: Function = MyClass; // ok
yyyllmsg

yyyllmsg5#

**Type<T>**from @angular/core是Class的合适接口。

export interface Type<T> extends Function {
    new (...args: any[]): T;
}

你可以使用它来保持对类的引用,而不是这个类的示例:

private classRef: Type<MyCustomClass>;

private classRef: Type<any>;

根据您对@ViewChild问题的背景:

@ViewChild允许注入"string selector"/Component/Directive

Type<any> | Function | string的签名是一个抽象签名,允许我们注入上述所有内容。

pieyvz9o

pieyvz9o6#

以下为我工作:

type ClassRef = new (...args: any[]) => any;

我的用例:

interface InteractionType { [key: string]: ClassRef; }
xmq68pz9

xmq68pz97#

下面是一个只包含类的类型的示例:

declare type Class<T = any> = new (...args: any[]) => T;
bvjveswy

bvjveswy8#

以下是另一个不使用typeof的解决方案:
Typescript有一个名为InstanceType的实用程序类型,它的声明是:

type InstanceType<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R ? R : any

你可以使用它来声明你自己的类类型,代码如下:

interface ClassType<InstanceType extends {} = {}> extends Function {
  new(...args: any[]): InstanceType
  prototype: InstanceType
}

相关问题