【问题标题】:How can I create an instance of an array declared via a type in TypeScript?如何创建通过 TypeScript 中的类型声明的数组的实例?
【发布时间】:2022-01-10 18:49:55
【问题描述】:

如果我从这个开始:

type Board = Array<Array<number>>;

然后,当我传递电路板时,这可以很好地进行类型检查:

function boardWins(board:Board):boolean { ... }

但是当我真正需要创建一个板时,我会这样做:

  function createBoard():Board {
    // How can I just instantiate a Board? "new Board()" throws an error
    return new Array<Array<number>>();
  }

返回类型很好,这是我想避免的“新”调用中对整个类型的冗余重新声明。

如果我尝试new Board(),我会得到:

'Board' only refers to a type, but is being used as a value here.

好的,是的,构造函数是函数,没有Board 函数,但是当我实例化其中一个时,是否没有语法糖可以避免重复发明这个轮子的冗余和潜在错误?

感谢您的帮助!

【问题讨论】:

    标签: typescript typescript-generics


    【解决方案1】:

    你创建的值只是一个空数组。剩下的所有语法都是关于给它你想要的类型,当你已经声明了类型时,这不是必需的。

    function createBoard(): Board {
      return [];
    }
    

    不,没有通用的方法来实例化任意 TypeScript 类型。这对结构类型没有意义。

    【讨论】:

    • 我明白了......我想我明白了...... Board 只是一个类型检查,任何数组都会满足它,除非 TypeScript 捕捉到我以某种方式操纵它的气味不符合类型限制。因为最终它只是一个数组,而我所做的只是实例化它,所以没有什么问题。如果我真的尝试将错误的东西放入其中然后返回它,编译器已经能够尝试检测到它,因为我声明了返回类型。谢谢。
    【解决方案2】:

    你只返回看起来像你指定的类型的东西, 所以你可以返回

    return [[1, 2, 3]]
    

    return []
    

    return [[]]
    

    但不是

    return [1]
    

    return [["abc"]]
    

    无需使用new Array,只需创建并返回如上所示的内容。

    【讨论】:

    • 谢谢,这也很有帮助,但我接受了帮助我进一步了解原因的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多