Typescript 中的 new() 是什么?

IT技术 javascript typescript
2021-03-11 16:09:08

new()在官方文档中遇到这里关于泛型的问题。

这是代码上下文:

function create<T>(c: { new(): T; } ): T {
    return new c();
}

上面的代码被转译为下面的 JavaScript 代码:

function create(c) {
    return new c();
}

new()是 JavaScript 中的非法语法。它在 TypeScript 中是什么意思?

另外,是什么{new(): T; }意思?我知道它必须是一种类型,但是如何呢?

3个回答

new()描述typescript中的构造函数签名。这意味着它描述了构造函数的形状。例如拿{new(): T; }. 你是对的,它是一种类型。它是构造函数不接受参数的类的类型。考虑以下示例

function create<T>(c: { new(): T; } ): T {
    return new c();
}

这意味着该函数create接受一个参数,其构造函数不接受任何参数并返回一个 type 实例T

function create<T>(c: { new(a: number): T; } ): T

这意味着 create 函数接受一个参数,其构造函数接受一个数字a并返回一个 T 类型的实例。另一种解释它的方法可以是以下类的类型

class Test {
    constructor(a: number){

    }
}

将是 {new(a: number): Test}

也许添加一个实现它们的类(以及它们到 javascript 的转换)将有助于解决问题。
2021-04-21 16:09:08
当然,javascript 中有新的 functionName()。您创建该函数对象的新实例。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-05-03 16:09:08
是的,但有没有new(),有new functionName()new ClassName(),但没有new()
2021-05-07 16:09:08
转译type后将不存在,因为 javascript 中没有类型的概念,因此不会有new(). new()在javascript中没有这样的东西..它只是在typescript中
2021-05-11 16:09:08
啊,原来如此。:) 这只是typescript的东西
2021-05-14 16:09:08

new 关键字用于创建一个类的实例,所以它是最简单的形式:

class SimpleClass {
}

将按如下方式构建:

let simpleClassInstance = new SimpleClass();

这一切都很好,但是如何创建泛型类的实例,即:

class SimpleClassFactory< T > {
    static create( T ) {
        return new T(); // compile error could not find symbol T
    }
}

将按如下方式使用:

let simpleClassInstance = SimpleClassFactory.create(SimpleClass);

在这里,我们尝试使用类定义来创建类的实例。这将产生编译错误。

所以我们需要通过它的构造函数签名来引用类型:

class SimpleClassFactory< T > {
    static create( type: { new(): T ;} ) {
        return new type(); // succeeds
    }
}

所以在文档中提到语法是“使用泛型在 TypeScript 中创建工厂时”。

如果你看一个更大的例子,他们有:

class BeeKeeper {
    hasMask: boolean;
}

class ZooKeeper {
    nametag: string;
}

class Animal {
    numLegs: number;
}

class Bee extends Animal {
    keeper: BeeKeeper;
}

class Lion extends Animal {
    keeper: ZooKeeper;
}

function findKeeper<A extends Animal, K> (a: {new(): A;
    prototype: {keeper: K}}): K {

    return a.prototype.keeper;
}

findKeeper(Lion).nametag;  // typechecks!

a: {new(): A
// is actually creating a new instance of the type A which is extending Animal.
// it is necessary to refer to class types by their constructor functions
还是不清楚。你能举一个更简单而不是复杂的 new() 例子吗?谢谢!
2021-05-07 16:09:08