gpt4 book ai didi

javascript - 数组类型检查在嵌套对象中不起作用

转载 作者:行者123 更新时间:2023-12-04 01:05:50 24 4
gpt4 key购买 nike

let test: number[] = [1, 2, 3, 'a'] // correctly fails

let test2 = {
demo: 1,
items: <number[]> ['a', 'b'], // correctly fails
}

let test3 = {
demo: 1,
items: <number[]> [1, 2, 3, 'a'], // why passes if there is string inside?
}

Sandbox here

为什么如果至少有一个正确的值类型就通过,而允许其余错误?如何确保对象项中的 ALL 数组值是特定类型?

最佳答案

test 的语法与 test2 相比,与您使用的有所不同和 test3 .这:

let test: number[] = [1, 2, 3, 'a']

注释 test 的类型: 它需要 testnumber[] .分配给它的数组不满足该类型,因此失败。

你的第二个和第三个例子是完全不同的东西,它是类型断言。使用 <> 进行类型断言或 as基本上是在告诉 TypeScript:“我知道我在做什么,这个表达式 SomeType 类型的,即使类型检查器无法从上下文中确定它。

对于类似的例子,以下是允许的:

const something = localStorage.foobar as number;

或者,等价地

const something = <number> localStorage.foobar;

即使 localStorage 没有 foobar属性是一个数字。 (本地存储属性是字符串或函数)使用 as<> s,你断言类型,不管 TS 可以推断什么,而不是检查类型

第二个例子 test2失败并显示以下错误消息:

Conversion of type 'string[]' to type 'number[]' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.

失败不是因为类型不可断言,而是因为这两种类型没有充分重叠

test3通过因为Array<number | string>确实与 Array<number> 有一些重叠.

要修复它并让 test2 和 test3 按预期失败,请返回您在第一个示例中使用的语法,将类型放在紧跟在变量名之后的冒号之后:

let test3: {
demo: number;
items: number[];
} = {
demo: 1,
items: [1, 2, 3, 'a'], // This fails - good!
}

以便 TypeScript 的类型检查器能够正确地检查它,并在不进行任何类型断言的情况下导致输入错误。

关于javascript - 数组类型检查在嵌套对象中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66512329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com