gpt4 book ai didi

typescript - 数组永远不会为空,但 typescript 不知道

转载 作者:行者123 更新时间:2023-12-02 02:22:16 28 4
gpt4 key购买 nike

我收到此错误 Expected at least 1 arguments, but got 0 or more from:

    if (initialValues.length > 0) {
return Object.assign(...initialValues);
}

我猜它是在提示 initialValues 可能是空的。但是,if 条件保证它不会为空。我该怎么做才能让 typescript 意识到这一点?

最佳答案

允许 length check as a type guard被认为“太复杂”而无法添加到 TypeScript(感谢 @jcalz 提供链接!)。

您至少可以采用三种方法:

显式解构并提供目标

因为它不是从 length 检查中得到的,我可能会明确地给它目标对象,像这样:

const [target, ...sources] = initialValues;
if (target) {
return Object.assign(target, ...sources);
}

它对此很满意。

Playground link

定义为非空数组

This answer显示如何为非空数组定义类型:

type NonEmptyArray<T> = [T, ...T[]];

如果 initialValues 在编译时已知总是至少有一个元素,则使用该类型定义它:

let initialValues: NonEmptyArray<YourObjectType>;

然后您可以删除 if,因为您知道它永远为真:

return Object.assign(...initialValues);

使用类型保护

但是如果它可以为空并且需要运行时检查,你可以定义一个类型保护函数:

function isNotEmpty<T>(arr: T[]): arr is NonEmptyArray<T> {
return arr.length > 0;
}

然后是:

if (isNotEmpty(initialValues)) {
return Object.assign(...initialValues);
}

非常感谢@jcalz@VLAZ帮助回答这个问题。

关于typescript - 数组永远不会为空,但 typescript 不知道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66211564/

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