gpt4 book ai didi

TypeScript - 为什么数组 .includes() 期望 searchElement 为 "never"类型?

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

我有一个对象,其中每个字段都是字符串数组。我还有一个字符串变量,它只能具有基于对象中数组值的值。

现在我想检查这个字符串属于哪个数组(哪个对象字段)。我通过简单地使用 includes() 来做到这一点并且代码工作正常,但出于某种原因 TS 提示。即使那个特定的数组可以有特定的值,它也会从我这里排除“从不”。我简化了代码以仅显示 TS 问题。

const demo = {
a: ['value1', 'value2'],
b: ['value3'],
} as const

let demoValue: typeof demo[keyof typeof demo][number] // possible "value1" "value2" "value3"
demoValue = 'value3' // some user interaction

const test = (parent: keyof typeof demo, value: typeof demoValue) => {
console.log(demo[parent].includes(value)) // "type 'string' is not assignable to type 'never'"
}

test('a', 'value2') // ok
test('WRONG', 'value2') // there is TS error, so ok
test('a', 'WRONG') // there is TS error, so ok

Playground

我可以通过制作 includes(value as never) 来“修复”这个问题,但我觉得这不是真正的修复,而是针对错误类型的更多解决方法...

最佳答案

您可以使用类型断言,但在这种情况下有一个稍微更安全的选项。如果您声明一个 wideList,它是所有可能值的并集的数组,您可以将列表的并集分配给它,而无需使用 as

const test = (parent: keyof typeof demo, value: typeof demoValue) => {
const wideList: readonly (typeof demoValue)[] = demo[parent];

console.log(wideList.includes(value));
}

Playground Link

更新:想到另一个解决方案,您可以定义一个函数式 includes(而不是 OO),它能够更好地处理列表的联合:

const includes = <T>(arr: readonly T[], x: T): boolean => arr.includes(x)

const test = (parent: keyof typeof demo, value: typeof demoValue) => {
console.log(includes(demo[parent], value))
}

Playground Link

关于TypeScript - 为什么数组 .includes() 期望 searchElement 为 "never"类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71639989/

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