TypeScript:如果数组包含空对象变量,为什么检查类型 object[] 失败?

问题描述 投票:0回答:1

如果数组包含一个包含空对象的变量,那么为什么类型检查

object[]
会失败:

let emptyObject = {};
let objectArray : object[] = [emptyObject, true, 1]; // no compile error, but should throw error

游乐场链接

这不会显示任何错误或警告,但它应该显示,因为

true
1
不应该出现在类型为
object[]
的数组中。

如果我直接使用空对象文字

{}
或非空对象,一切都会按预期工作:

let objectArray2 : object[] = [{}, true, 1]; // as excpected: type 'boolean' is not assignable to 'object'
let nonEmptyObject = {a: 1};
let objectArray3 : object[] = [nonEmptyObject, true, 1]; // as expected: type 'boolean' is not assignable to 'object'

游乐场链接

这是 TypeScript 的错误,还是我遗漏了什么? 我正在使用 TypeScript 版本

5.4.5

typescript typescript-typings
1个回答
0
投票

在检查包含空对象变量的数组的类型时,您似乎在 TypeScript 中遇到了意外行为。在您的代码示例中,您将一个空对象分配给 emptyObject 变量,然后创建一个类型为 object[] 的数组 objectArray,其中包括 emptyObjecttrue1 .

根据您的理解,由于 objectArray 的类型定义为 object[],您期望 TypeScript 抛出错误,因为 true1 不应该分配给 object 类型。

但是,在这种情况下,TypeScript 不会抛出错误,因为类型 object[] 是结构类型。这意味着 TypeScript 仅检查数组的元素是否与 object 的结构兼容。由于 true1 可以分配给 object,TypeScript 不会引发错误。

另一方面,当您直接使用空对象文字 {} 或非空对象(如 nonEmptyObject)时,TypeScript 会正确识别 true1 不可分配给 object 类型,并引发错误。

因此,这种行为不是 TypeScript 中的错误,而是结构类型工作方式的结果。如果您想限制数组仅包含空对象,您可以考虑使用更具体的类型或自定义类型保护来在运行时强制执行约束。

© www.soinside.com 2019 - 2024. All rights reserved.