当前位置: 首页 > 知识库问答 >
问题:

TypeScript不是用Array()构造并填充的类型检查数组

墨承泽
2023-03-14

TypeScript版本2.4.2,使用--target ES6编译

代码行:

var coins: { coin: number}[] = [1,1,1]

导致TypeScript抛出

错误TS2322:类型“number[]”不能分配给类型{coin:number;}[]'

然而,线路:

var coins: { coin: number}[] = Array(3).fill(1)

编译成功,没有错误。

这是TypeScript错误,还是预期行为(不是以这种方式声明的数组的类型检查)?。如果是,为什么?

共有1个答案

濮阳祯
2023-03-14

问题是Array(3)创建一个长度为3的数组并键入any[]然后填充对该数组进行操作。由于any可以分配给任何类型,因此any[]也可以分配给任何其他类型的数组(包括{coin: number}

如果要为数组指定类型参数,则会出现错误:

var coins: { coin: number}[] = Array<{ coin: number}>(3).fill(1) // 1 is not assignable to { coin: number}

遗憾的是,没有办法防止省略数组的类型参数。

 类似资料:
  • TypeScript中非抽象类(非抽象构造函数)的类型签名如下: 这也称为可更新类型。但是,我需要一个抽象类(抽象构造函数)的类型签名。我理解它可以定义为具有类型,但这太宽泛了。难道没有更精确的替代方案吗? 编辑: 为了阐明我的意思,下面的小片段演示了抽象构造函数和非抽象构造函数之间的区别: 类型'typeof实用程序'不能分配给类型'new(... args: any[])= 无法将抽象构造函数

  • 本文向大家介绍TypeScript 运行时类型检查补充工具,包括了TypeScript 运行时类型检查补充工具的使用技巧和注意事项,需要的朋友参考一下 TypeScript是静态类型系统,在编译时做类型检查。一般而言,如果项目所用到的所有库、模块都是基于ts的,那么静态类型已经可以避免大部分编程层面的类型问题。不过,在一些场景下来,单纯静态类型是无法解决问题的,部分数据是动态传入到系统中的,主要包

  • 第一种instanceof Array 来检测数组 if(value instanceof Array){ //数组操作 } 第二种使用Array.isArray()来检测数组 if(Array.isArray(value)){ //数组操作 }

  • 我有一个类,它有一些属性/方法,返回最初通过构造函数传递的值: 人们建议用泛型作为打字稿的等价物: 现在我有了一个子类,它调用超类的构造函数并传递以下选项: TypeScript编译器对此不满意,希望通过类型扩展Base类。但是我有两次信息,在超级呼叫和扩展符号中。什么是正确的ts语法来解决我的问题? (键入脚本中的代码)

  • 由于 Array 的构造函数在如何处理参数时有点模棱两可,因此总是推荐使用数组的字面语法 - [] - 来创建数组。 [1, 2, 3]; // 结果: [1, 2, 3] new Array(1, 2, 3); // 结果: [1, 2, 3] [3]; // 结果: [3] new Array(3); // 结果: [] new Array('3') // 结果: ['3'] // 译者