在Typescript中有"类"类型吗?并且"任何"包含它吗?

fro*_*.io 34 typescript angular

在Java中,您可以使用类"Class"将类作为参数提供给方法.我没有在打字稿文档中找到任何类似的东西 - 是否可以将类交给方法?如果是这样,"any"类型是否包含此类类型?

背景:我遇到了Webstorm的问题,告诉我无法将一个类移交给@ViewChild(...)Angular 2.然而,Typescript编译器并没有抱怨.签名@ViewChild()似乎是"Type<any> | Function | string",所以我想知道是否有任何包括类.

zzr*_*zrv 41

最简单的解决方案是let variable: typeof Class.

这里有一个例子:

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

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


f(A);
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案。当你想访问静态属性时,使用函数调用语法会失败,否则 (4认同)
  • 一旦您开始在类之间进行继承并且您的类具有不同的构造函数签名,这种方法就会失效。(认为​​“类 B 扩展了 A”,其构造函数比“A”的构造函数接受更多参数。)在这种情况下,编译器不会接受“f(B)”。 (2认同)
  • 完美的。这将为静态成员启用类型提示。 (2认同)

Nit*_*mer 36

您在打字稿中所要求的等价物是类型{ new(): Class },例如:

class A {}

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

let a = create(A); // a is instanceof A
Run Code Online (Sandbox Code Playgroud)

(游乐场代码)

  • 请注意,您可能需要`new(... args:any [])=> Class`.这个答案中提出的代码只允许构造函数没有参数的类,这可能不是你所追求的. (13认同)
  • 注意`{new():Class}`也可以写成`new()=&gt; Class`。https://github.com/Microsoft/TypeScript/blob/v2.6.1/doc/spec.md#3.8.9 (4认同)
  • 就我而言,我发现`(ctor:typeof A)`足够好。 (3认同)
  • 这不适用于具有仅公开静态工厂方法的私有构造函数的类(例如 [LocalDate](https://js-joda.github.io/js-joda/manual/LocalDate.html)) (3认同)

Bug*_*ggy 13

Angular内部声明 Type为:

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

使用TypeScript3,应该可以为参数添加类型,而不会导致函数重载:

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

例:

class A {}

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

let a = create(A);
Run Code Online (Sandbox Code Playgroud)


Dav*_*ret 10

是否可以将类交给方法?如果是这样,"any"类型是否包含此类类型?

是的,是的.any包括每种类型.

以下是仅包含类的类型示例:

type Class = { new(...args: any[]): any; };
Run Code Online (Sandbox Code Playgroud)

然后使用它:

function myFunction(myClassParam: Class) {
}

class MyClass {}

myFunction(MyClass); // ok
myFunction({}); // error
Run Code Online (Sandbox Code Playgroud)

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

var func: Function = MyClass; // ok
Run Code Online (Sandbox Code Playgroud)


lir*_*zan 8

以下对我有用:

type ClassRef = new (...args: any[]) => any;
Run Code Online (Sandbox Code Playgroud)

我的用例:

 interface InteractionType { [key: string]: ClassRef; }
Run Code Online (Sandbox Code Playgroud)


ara*_*stu 7

以下是仅包含类的类型的示例:

declare type Class<T = any> = new (...args: any[]) => T;
Run Code Online (Sandbox Code Playgroud)


Ant*_*nko 6

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

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

您可以使用它来保持对类的引用,而不是此类的实例:

private classRef: Type<MyCustomClass>;
Run Code Online (Sandbox Code Playgroud)

或者

private classRef: Type<any>;
Run Code Online (Sandbox Code Playgroud)

根据您的问题的背景@ViewChild

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

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