在函数之间传递参数时出现TypeScript错误

时间:2018-12-06 17:06:07

标签: javascript typescript

此模式引发TypeScript错误:

  

类型'(string | number)[]'的参数不能分配给参数   'string []类型的|数字[]'

function foo(value: string | number) {
  return bar([value]); // <- TypeScript error
}

function bar(valueList: string[] | number[]) {
  ..does something...
}

我理解这是因为TypeScript编译器会将其视为包含字符串和数字的数组。

是否有一种类型安全的方法来完成此任务?我只能认为要转换为any[],这感觉很糟糕:

function foo(value: string | number) {
  const valueList: any[] = [value];
  return bar(valueList);
}

3 个答案:

答案 0 :(得分:4)

一种执行此操作的方法是declaration merging;为您的函数定义两个单独的接口(请参见function types),然后对其进行单个实现:

interface Foo {
    (value: string): void;
}

interface Foo {
    (value: number): void;
}

const foo: Foo = function (value) {
  return bar([value]);
}

这将使两种类型分开,因为在任何给定时间只能调用其中一个接口。

答案 1 :(得分:2)

这是从jonrsharpe的答案中得到启发的,但是它没有使用单独的接口,而是使用了函数重载。

函数重载使我们可以为单个实现指定多个签名:https://www.typescriptlang.org/docs/handbook/functions.html#overloads

function foo(value: string);
function foo(value: number);
function foo(value: any) {
    return bar([value]);
}

function bar(valueList: number[] | string[]) {
}

答案 2 :(得分:1)

另一个答案很好(我赞成),但我个人会选择

return bar([value] as string[] | number[]);

尤其是如果我时间不多。这并不意味着它是错误的或骇人听闻的,您只是暗示有点傻(在这种情况下)打字稿。

P.S。如@paleo所述,这不是完全类型安全的。