不加要传实例对象。
参考Java语言中类似概念,对象拥有类型,一个类的实例,其类型就是该类。但是类本身是程序元数据,这一坨元数据自己作为数据当然也有自己的类型,其类型就是 java.lang.Class。
在JS中,不区分数据和元数据的概念,包括类,函数,实例在内的一切皆对象,也就是都被视为数据处理。class是ES6新加的概念,它是一个语法糖,在ES6以前,我们用一个用作构造函数的函数来支持类的功能。换句话说,在JS中,类本身是Function类的实例。
TS为JS添加了静态类型检查,要为一切JS对象赋予一个类型描述。在TS中,函数是Function的实例,其类型用(...args: any) => any来描述。但由于自ES6以来JS严格区分了构造函数和普通函数,所以TS为构造函数的类型使用了另一种语法new (...args: any) => any。
具体到楼主截图的代码,假设有一个SpriteFrame类的实例,即组件sp,那么描述这个组件的类型就是SpriteFrame。而SpriteFrame自己也是一个对象,具体来说,是一个Function类型的对象,其具体类型是一个构造函数,那么cc模块中导出的SpriteFrame这个东西,其TS类型就是new () => SpriteFrame。
在ts中当你拿到一个变量时,如果想要获取它的编译时类型,可以用typeof运算符来获取,也就是说,当你import { SpriteFrame } from 'cc';之后,如果你想表示new () => SpriteFrame,有一个简单的办法,就是获取SpriteFrame 这个对象本身的类型,其结果就是new () => SpriteFrame了。
简要总结一下,在TS中,类名只能用来表示实例的类型,而类本身的类型要用构造函数语法来描述,一般地,可以通过typeof一个构造函数,来获取其类型。
感谢大佬耐心解惑
谢谢大佬的解惑
a:SpriteFrame 这样声明的话, a 是一个SpriteFrame的实例。
a:typeof SpriteFrame,这样声明的话,a指向的是一个 class。 你可以 new a(); 来创建一个 SpriteFrame 的实例。
