【问题标题】:what is new() in Typescript?打字稿中的 new() 是什么?
【发布时间】:2017-01-30 01:42:56
【问题描述】:

我在官方文档here中遇到了new()关于泛型。

这里是代码上下文:

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

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

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

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

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

【问题讨论】:

  • 在接口或内联接口中使用它描述构造函数的签名。
  • @toskv new() 看起来像一个函数调用。为什么是构造函数的签名?
  • 在 es5 中,实现类的方式是在函数实例中创建。这就是 new functionName() 的方法。

标签: javascript typescript


【解决方案1】:

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

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

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

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

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

class Test {
    constructor(a: number){

    }
}

应该是{new(a: number): Test}

【讨论】:

  • 也许添加一个实现它们的类(以及它们到 javascript 的转换)将有助于解决问题。
  • 转译后type将不存在,因为javascript中没有类型的概念,因此不会有new()。 javascript中没有new()之类的东西。它只是在打字稿中
  • 当然在javascript中有新的functionName()。您创建该函数对象的新实例。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 有但没有new(),有new functionName()new ClassName()但没有new()
  • 啊,确实是这样。 :) 这只是打字稿的东西
【解决方案2】:

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
    }
}

【讨论】:

    【解决方案3】:

    所以在文档中提到语法是“当使用泛型在 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() 例子吗?谢谢!
    猜你喜欢
    • 2017-05-25
    • 1970-01-01
    • 2016-04-08
    • 2017-01-23
    • 2023-04-10
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多