迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > TypeScript >

如何解决 TypeScript 中 Type 'X' cannot be used as an index type 错误

作者:迹忆客 最近更新:2023/01/31 浏览次数:

当我们尝试使用不能用于索引数组或对象的类型时,会出现错误“Type cannot be used as an index type”,例如 非原始类型之一,如 String。 要解决错误,需要使用原始(小写)类型,例如 键入值时的 numberstring

下面是产生上述错误的一个示例。

// ✅ With arrays (should be `number`)
const num: Number = 1;

const arr = ['a', 'b', 'c'];

// ⛔️ Error: Type 'Number' cannot be used as an index type.ts(2538)
arr[num]

// ✅ With objects
const obj = {
  0: 'a',
  1: 'b',
  2: 'c',
};


// 👇️ should be `number`
const num2: Number = 2;

// ⛔️ Error: Type 'Number' cannot be used as an index type.ts(2538)
obj[num2]

TypeScript 中 Type 'X' cannot be used as an index type 错误

我们使用 Number,非原始对象类型来键入 numnum2 变量,这导致了错误。

我们不能使用非原始类型,如 NumberStringBooleanObject 作为索引类型。

要解决该错误,需要始终改用 number, string, boolean, Record 类型。

// 👇️ now using number (lowercase n)
const arr1: number[] = [0, 1, 2];

const arr2 = ['a', 'b', 'c'];

console.log(arr2[arr1[0]]); // 👉️ "a"

我们使用了解决错误的原始数字类型。

错误是因为原始数字、字符串和布尔类型与非原始数字、字符串、布尔、对象等类型之间存在差异。

非基本类型是对象,在 TypeScript 中键入值时不应使用。

TypeScript 最佳实践文档警告在 TypeScript 代码中键入值时切勿使用 NumberStringBooleanSymbolObject 非原始对象。

相反,我们应该使用 number, string, boolean, symbolRecord 类型。

该错误消息意味着您在尝试在 TypeScript 中索引数组或对象时无法使用指定的类型。

这是错误如何发生的另一个示例。

interface Person {
  key: String; // 👈️ should be string
}

const obj1: Person = {
  key: 'name',
};

const obj2 = {
  name: 'John Smith',
};

// ⛔️ Error: Type 'String' cannot be used as an index type.ts(2538)
obj2[obj1.key]

上面的代码片段显示了使用 String 非基本对象类型如何导致错误,因为它不能用于在特定属性处索引对象。

interface Person {
  key: string; // 👈️ using primitive type
}

const obj1: Person = {
  key: 'name',
};

const obj2 = {
  name: 'John Smith',
};

// ✅ Works
console.log(obj2[obj1.key as keyof typeof obj2]); // 👉️ "John Smith"

使用字符串原始类型解决了这个问题。

当我们尝试将 String 类型的值分配给 string 类型的值时,会显示错误原因。

const str1: String = 'hello world';

// ⛔️ Error: Type 'String' is not
// assignable to type 'string'.
// 'string' is a primitive, but 'String'
// is a wrapper object. Prefer using 'string' when possible.
const str2: string = str1;

TypeScript Type 'String' is not assignable to type 'string'

StringNumberBooleanSymbolObject 等大写非原始对象不等同于 stringnumberboolean 等。

确保始终使用数字、字符串、布尔值、符号和记录。


总结

当我们尝试使用不能用于索引数组或对象的类型时,会出现错误“Type cannot be used as an index type”,例如 非原始类型之一,如 String。 要解决错误,请使用原始(小写)类型,例如 键入值时的 numberstring。。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 TypeScript 中返回一个 Promise

发布时间:2023/03/19 浏览次数:182 分类:TypeScript

本教程讨论如何在 TypeScript 中返回正确的 Promise。这将提供 TypeScript 中 Returns Promise 的完整编码示例,并完整演示每个步骤。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便