如何解决 TypeScript 中 Type 'undefined' cannot be used as an index type 错误
当可能未定义的值用于索引对象或数组时,会出现“Type 'undefined' cannot be used as an index type”错误。 要解决该错误,请使用类型保护来确保在索引对象或数组之前该值不是未定义的。
下面是产生上述错误的一个示例。
// 👇️ key is optional (could be undefined)
const obj1: { key?: string } = {
key: 'name',
};
const obj2 = {
name: 'James Doe',
};
// ⛔️ Error: Type 'undefined' cannot be
// used as an index type.ts(2538)
const result = obj2[obj1.key];
我们在 obj1 变量中使用问号将 key
属性标记为可选。
这意味着 obj1.key
属性可以是一个字符串或者它可以有一个未定义的值。
通过错误消息,TypeScript 告诉我们不能使用未定义的值来索引对象。
为了解决这个错误,我们必须在访问该属性之前有条件地检查该值是否未定义。
// 👇️ key is optional (could be undefined)
const obj1: { key?: string } = {
key: 'name',
};
const obj2 = {
name: 'James Doe',
};
const result = obj1.key != undefined ? obj2[obj1.key as keyof typeof obj2] : '';
console.log(result); // 👉️ "James Doe"
在访问对象中的特定属性之前,我们使用三元运算符检查 obj1.key
属性是否为空(null 或 undefined)。
如果该属性为空,我们只需返回字符串的后备值。
我们还可以使用用作类型保护的简单 if
语句。
const obj1: { key?: string } = {
key: 'name',
};
const obj2 = {
name: 'James Doe',
};
let result = '';
if (obj1.key != undefined) {
result = obj2[obj1.key as keyof typeof obj2];
}
console.log(result); // 👉️ "James Doe"
obj1.key
属性保证是 if 块中的字符串,因此我们可以安全地将其用作索引类型。
当我们尝试使用可能未定义的值来索引数组时,也会发生该错误。
const arr = ['a', 'b', 'c'];
const num: number | undefined = Math.random() > 0.5 ? 0 : undefined;
// ⛔️ Error: Type 'undefined' cannot be
// used as an index type.ts(2538)
arr[num];
num
变量可以存储数字或未定义的值,TypeScript 不允许我们使用未定义的值索引数组。
const arr = ['a', 'b', 'c'];
const num: number | undefined = Math.random() > 0.5 ? 0 : undefined;
if (num != undefined) {
const result = typeof num !== undefined ? arr[num] : '';
console.log(result); // 👉️ "a"
}
num 变量保证是 if
块中的数字,因此我们可以安全地访问特定索引处的数组。
如果上述解决方案均无效,并且我们确定该值是一个数字,则可以使用类型断言。
const arr = ['a', 'b', 'c'];
const num: number | undefined = 1;
const result = arr[num as number]; // 👈️ type assertion
console.log(result); // 👉️ "b"
当我们有关于 TypeScript 不知道的值类型的信息时,使用类型断言。
我们有效地告诉 TypeScript num 变量将是一个数字,不用担心。
总结
当可能未定义的值用于索引对象或数组时,会出现“Type 'undefined' cannot be used as an index type”错误。 要解决该错误,需要使用类型保护来确保在索引对象或数组之前该值不是 undefined。
相关文章
在 AngularJs 中设置 Select From Typescript 的默认选项值
发布时间:2023/04/14 浏览次数:78 分类:Angular
-
本教程提供了在 AngularJs 中从 TypeScript 中设置 HTML 标记选择的默认选项的解释性解决方案。
在 Angular 中使用 TypeScript 的 getElementById 替换
发布时间:2023/04/14 浏览次数:153 分类:Angular
-
本教程指南提供了有关使用 TypeScript 在 Angular 中替换 document.getElementById 的简要说明。这也提供了在 Angular 中 getElementById 的最佳方法。
在 TypeScript 中使用 try..catch..finally 处理异常
发布时间:2023/03/19 浏览次数:181 分类:TypeScript
-
本文详细介绍了如何在 TypeScript 中使用 try..catch..finally 进行异常处理,并附有示例。
在 TypeScript 中使用 declare 关键字
发布时间:2023/03/19 浏览次数:97 分类:TypeScript
-
本教程指南通过特定的实现和编码示例深入了解了 TypeScript 中 declare 关键字的用途。
在 TypeScript 中 get 和 set
发布时间:2023/03/19 浏览次数:172 分类:TypeScript
-
本篇文章演示了类的 get 和 set 属性以及如何在 TypeScript 中实现它。
在 TypeScript 中格式化日期和时间
发布时间:2023/03/19 浏览次数:161 分类:TypeScript
-
本教程介绍内置对象 Date() 并讨论在 Typescript 中获取、设置和格式化日期和时间的各种方法。
在 TypeScript 中返回一个 Promise
发布时间:2023/03/19 浏览次数:182 分类:TypeScript
-
本教程讨论如何在 TypeScript 中返回正确的 Promise。这将提供 TypeScript 中 Returns Promise 的完整编码示例,并完整演示每个步骤。
在 TypeScript 中定义函数回调的类型
发布时间:2023/03/19 浏览次数:221 分类:TypeScript
-
本教程说明了在 TypeScript 中为函数回调定义类型的解决方案。为了程序员的方便和方便,实施了不同的编码实践指南。
在 TypeScript 中把 JSON 对象转换为一个类
发布时间:2023/03/19 浏览次数:110 分类:TypeScript
-
本教程演示了如何将 JSON 对象转换为 TypeScript 中的类。