什么是Typescript中的new()?

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}

  • 也许添加一个实现它们的类(以及它们到 javascript 的转换)将有助于解决问题。 (2认同)
  • 是的,但没有`new()`,有`new functionName()` 和`new ClassName()`,但没有`new()` (2认同)

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)