【问题标题】:Typescript generics, new keyword in generics extends打字稿泛型,泛型中的新关键字扩展
【发布时间】:2020-07-24 17:39:33
【问题描述】:

正在阅读有关装饰器的 TS 文档并遇到以下语法:

   function classDecorator<T extends {new(...args:any[]):{}}>(constructor:T) {
        return class extends constructor {
            newProperty = "new property";
            hello = "override";
        }
    }

我不完全理解以下使用的泛型

<T extends {new(...args:any[]):{}}>

我确实了解泛型以及泛型中的 extends 关键字。不过我现在想知道以下语法{new(...args:any[]):{}} 的含义,尤其是new 的使用,在泛型表达式中传播... 运算符和对象文字语法{}

【问题讨论】:

    标签: typescript generics


    【解决方案1】:

    {new(...args:any[]):{}} 这个结构的总体含义如下:

    “具有构造函数的对象,该构造函数接受可变数量的任何类型的参数”。

    ...args 是一个 javascript(因此也是打字稿)变量参数声明:

    function f(...args: string[]) {}
    
    f("asd", "a", "v")
    

    在这种情况下,{} 返回类型只是字面上的空对象。

    然后打字稿extend 放松了对函数参数的约束(因为任何函数参数组合确实扩展了...args: any[]) 而对于返回类型(因为任何对象都扩展{},并且构造函数隐式返回构造的对象)

    所以这个签名的意思是:“给我任何可以通过new关键字创建的东西,无论如何。”

    ts 操场上的小example

    【讨论】:

      【解决方案2】:

      它基本上是一个类检查(带有构造函数的对象)

      {new ... }

      这些打开和关闭的花括号表明我们正在一个对象内部工作。点赞:{num: number}

      new(...args: any[])
      

      这里的new 关键字突出表明我们正在寻找具有构造函数的东西。 ...args: any[] 只是声明这个类型不关心这个构造函数的参数。

      更具体地说,...args 的三个点表示可以有任意数量的参数,而any[] 表示这些参数可以具有any 类型,这意味着它们绝对可以是任何东西。

      然后:

      : {}
      

      这表明构造函数应该返回一个对象,如果它是一个类,它很可能会返回一个对象。

      我从来没有见过这样写的,通常情况下,这样做就足够了:

      <T extends new (...args: any[])=>Object>
      

      原来的需要用{...} 包装的原因是因为使用冒号: 而不是箭头=&gt; 会混淆打字稿,因为它不希望在对象或类型之外有冒号定义。

      总而言之,你有这种类型是有意义的,因为它确保这个装饰器只能应用于一个类,并在装饰器本身中输入它。

      【讨论】:

        猜你喜欢
        • 2015-11-27
        • 2021-10-04
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 1970-01-01
        • 2017-06-18
        • 1970-01-01
        相关资源
        最近更新 更多