数组永远不会为空,但打字稿不知道

时间:2021-02-15 16:17:05

标签: typescript

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

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

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

1 个答案:

答案 0 :(得分:4)

允许 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 帮助回答这个问题。

相关问题