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

如何在打字稿中定义const数组

孟选
2023-03-14

我的代码:

const WEEKDAYS_SHORT: string[] = ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam']

错误消息来自TypeScript(3.0)编译器:

TS2322:类型“string[]”不可分配给类型“[string, string, string, string, string, string, string]”。“string[]”类型中缺少属性“0”。

如果我将字符串[]更改为只读数组

TS2322:“ReadonlyArray”类型不能分配给类型“[string,string,string,string,string,string,string]”。类型“ReadonlyArray”中缺少属性“0”。

我的tsconfig.json:

{
  "compilerOptions": {
    "declaration": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": ["es6", "dom"],
    "module": "es6",
    "moduleResolution": "node",
    "sourceMap": true,
    "target": "es5",
    "jsx": "react",
    "strict": true
  },
  "exclude": [
    "**/*.spec.ts",
    "node_modules",
    "vendor",
    "public"
  ],
  "compileOnSave": false
}

如何在TypeScript中定义只读数组?

共有3个答案

韦宏扬
2023-03-14

虽然公认的答案是正确的,但它确实有一个缺点。

const readonlyArray = [1, 2, 3] as const;

let x = 4; // function parameter, etc.
// Argument of type 'number' is not assignable to parameter of type '1 | 2 | 3'.ts(2345)
// if (readonlyArray.includes(x)) {}

一种替代方法是使用只读:

const readonlyArray: readonly number[] = [1, 2, 3];

let x = 4;
if (readonlyArray.includes(x)) {} // OK

// Property 'push' does not exist on type 'readonly number[]'.ts(2339)
// readonlyArray.push(4);
卫彭亮
2023-03-14

调试后发现不是TypeScript编译器问题,是因为我使用了第三方组件调用DayPicker:

          <DayPicker
            onDayClick={this.handleDayClick}
            selectedDays={posts.day}
            months={MONTHS}
            weekdaysShort={WEEKDAYS_SHORT}
            firstDayOfWeek={1}/>

道具的类型不是字符串,而是字符串,字符串,字符串,字符串

weekdaysShort?: [string, string, string, string, string, string, string];

因此,TS compile表示字符串[]与[string,string,string,string,string,string]不匹配。

最后,我刚刚将类型从string[]更改为any,以避免此异常错误消息,当然,我们也可以更改为[string,string,string,string,string](太长)。

羊舌新荣
2023-03-14

将数组声明声明为const

const readonlyArray = [1, 2, 3] as const;

此外,访问只读数组的元素类型非常简单:

type Element = typeof readonlyArray[number]` // 1 | 2 | 3

因为const断言适用于任何声明,包括对象和深度嵌套的数据结构。您甚至可以将表达式断言为const。例如,如果值1被推断为数字,但您想提供数字文字类型,只需将其1断言为const。该功能是在TypeScript3.4中引入的。您也可以引用文档。

考虑到readOnlyconst数组通常称为元组(就像Python引用中的情况一样)。元组可以有相同类型的元素或完全不同类型的元素。请注意,在上面的示例中,Element类型不是推断为number,而是推断为数字文字的联合。这是可能的,因为元组的元素永远不会改变。推断最窄的可能类型是实用的。例如,您可以在需要数字的任何地方使用数字文字类型1,但不能在需要数字文字类型1的地方使用数字类型。

两个元素的元组通常称为一对,可以表示为乘积。虽然[number, string]的乘积不是数字,但您仍然可以将它们相乘。因为stringnumber本身都无限大,所以它们的乘积类型也是如此。考虑[1|2|3,'a'|'b'|'c']的更简单示例,它等于:

  [1, 'a']
| [1, 'b']
| [1, 'c']
| [2, 'a']
| [2, 'b']
| [2, 'c']
| [3, 'a']
| [3, 'b']
| [3, 'c']

进一步阅读:

  • 只读和常量
  • 产品类型
 类似资料:
  • 我有以下代码: 我遇到一个错误,指向.find并说: “字符串”类型的变量中不存在属性find。我知道错误在说什么,但是我如何将< code>$modal定义为一个我可以使用< code >的变量。查找于? 同样,现在我在typescript世界里,有没有更好的方法来定义modal,而不是在这里将它定义为var?

  • 我在AngularJS 1.X项目上使用Typescript。我出于不同的目的使用不同的Javascript库。为了对我的源代码进行单元测试,我想使用类型(= 接口)存根一些依赖项。我不想使用 ANY 类型,也不想为每个接口方法编写一个空方法。 我正在寻找一种方法来做这样的事情: 我现在的痛苦是,我要么使用< code>any并实现我的测试用例中调用的所有方法,要么实现接口并实现完整的接口。那太多

  • 我正在处理打字稿,并将一个函数传递给另一个函数。 如果我有一个传递到typescript中另一个函数的函数,我应该如何编写类型? 我尝试了,但似乎不起作用。

  • 问题内容: 我想为我的纯功能组件定义,但出现类型错误: 我知道我可以这样写: 有没有更好的添加方法? 问题答案: 您可以这样输入: 然后,你可以写,而无需强制转换的类型(会)。

  • 我想知道最好的方法,比如我有两个物体 如果objectC由创建 我如何声明/描述objectC,以便编译器/IDE知道它同时具有objectA和objectB的属性? 我想找到一种不需要为objectA和objectB定义接口的方法。我不想为同一个属性写两次声明和定义/求值。如果我在一个对象上有太多的属性,这种冗余是很重要的。 (是否有一个运算符可以提取现有对象的接口/类型?) 可能吗?

  • 我正在努力寻找 有什么不同?