Nic*_*.Xu 16 javascript typescript
我new()在这里的官方文档中遇到了关于泛型的问题.
这是代码上下文:
function create<T>(c: { new(): T; } ): T {
return new c();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码被转换为以下JavaScript代码:
function create(c) {
return new c();
}
Run Code Online (Sandbox Code Playgroud)
new()是JavaScript中的非法语法.TypeScript是什么意思?
此外,什么{new(): T; }意思?我知道它必须是一种类型,但如何?
Nah*_*nde 31
new()描述了typescript中的构造函数签名.这意味着它描述了构造函数的形状.比如拿{new(): T; }.你是对的它是一种类型.它是类的类型,其构造函数不带参数.请考虑以下示例
function create<T>(c: { new(): T; } ): T {
return new c();
}
Run Code Online (Sandbox Code Playgroud)
这意味着该函数create接受一个参数,其构造函数不带参数并返回一个类型的实例T.
function create<T>(c: { new(a: number): T; } ): T
Run Code Online (Sandbox Code Playgroud)
这意味着create函数接受一个参数,其构造函数接受一个数字a并返回一个类型为T的实例.另一种解释它的方法可以是,下面类的类型
class Test {
constructor(a: number){
}
}
Run Code Online (Sandbox Code Playgroud)
将会 {new(a: number): Test}
blo*_*ish 10
new 关键字用于创建一个类的实例,所以它是最简单的形式:
class SimpleClass {
}
Run Code Online (Sandbox Code Playgroud)
将按如下方式构建:
let simpleClassInstance = new SimpleClass();
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但是如何创建泛型类的实例,即:
class SimpleClassFactory< T > {
static create( T ) {
return new T(); // compile error could not find symbol T
}
}
Run Code Online (Sandbox Code Playgroud)
将按如下方式使用:
let simpleClassInstance = SimpleClassFactory.create(SimpleClass);
Run Code Online (Sandbox Code Playgroud)
在这里,我们尝试使用类定义来创建类的实例。这将产生编译错误。
所以我们需要通过它的构造函数签名来引用类型:
class SimpleClassFactory< T > {
static create( type: { new(): T ;} ) {
return new type(); // succeeds
}
}
Run Code Online (Sandbox Code Playgroud)