【问题标题】:Typescript throws no error when calling a function which expects (spread) arguments调用需要(传播)参数的函数时,Typescript 不会引发错误
【发布时间】:2020-10-29 22:57:47
【问题描述】:

在 Typescript 4.0.3 中,当我尝试调用传播参数的函数时,我预计会出错。 下面的代码不会抛出错误(并且 tsc 会编译它),但它显然会失败,因为没有要归约的数组。

是我的代码错误还是扩展运算符有问题?

calc.ts

export function substract(...a: number[]):number {
  return a.reduce((acc, val) => acc - val);
}

main.ts

import { substract } from "./calc.js";

console.log(substract()); // Should display an error
console.log(substract(1)); // Works fine
console.log(substract(2,1)); // Works fine

【问题讨论】:

  • 它不会因为没有数组而失败,它会因为它是一个 empty 数组而失败并且您没有提供初始值。但这是一个运行时问题,而不是编译时问题。
  • "// 应该显示一个错误" - 在没有输入的情况下调用可变参数函数通常是完全可以的。这意味着你得到一个空数组。您可以指定“至少一个参数”,但我认为更大的问题是您的代码没有处理空数组,而不是签名问题。
  • 谢谢@jonrsharpe,我的错误在这里,我在开发控制台中尝试过,没想到......“空参数”会导致[]。运行时问题的句子也很有意义,因为我使用的是 ts-jest,它立即导致测试失败。

标签: typescript


【解决方案1】:

Typescript 无法访问也不知道您在运行时传递的值。但是您可以做的一件事是指定您的函数参数类型,使其不接受空数组。

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

function substract(...a: NonEmptyArray<number>): number { 
  return a.reduce((acc, val) => acc - val);
}

console.log(substract()); // Expected at least 1 arguments, but got 0.
console.log(substract(1)); // Works fine
console.log(substract(2,1)); // Works fine

根据subtract 函数的功能,在函数体中处理空数组参数可能是合适的。例如,这样的事情会很好:

function substract(...a: number[]): number { 
  if (!a.length) throw Error("Expected a non empty array!") // or return 0 (whatever your logic is)
  return a.reduce((acc, val) => acc - val);
}

【讨论】:

    猜你喜欢
    • 2021-10-19
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2018-11-06
    • 1970-01-01
    相关资源
    最近更新 更多