Typescript函数联合类型缺少呼叫签名

时间:2018-11-17 13:32:57

标签: javascript typescript union overloading

interface F1 {
  (a, b): any;
}

interface F2 {
  (a): any;
}

type F3 = F1 | F2;

const f: F3 = (a) => {
  console.log(123, a);
}

f(1) // Error

我偶然发现TypeScript(3.1.4)中的一个神秘问题。当我调用f()时,编译器会说Cannot invoke an expression whose type lacks a call signature. Type 'F3' has no compatible call signatures. [2349]

这甚至很奇怪,因为上述所有代码在f(1)之前都可以正常工作。

我在这里错过了什么吗?如果有的话,如何给联合类型的函数输入?

我知道我可以做这样的事情

interface T {
  (a, b): any;
  (a): any;
}

但是然后我必须以这种方式定义功能

function (a, b?) {

}

我不太喜欢。任何帮助/反馈将不胜感激。

1 个答案:

答案 0 :(得分:1)

在打字稿中,|运算符描述了一个union type

  

联合类型描述的值可以是几种类型之一。我们使用竖线(|)分隔每种类型,因此数字|字符串布尔值是值的类型,可以是数字,字符串或布尔值。

interface F1 {
  (a, b): any;
}

interface F2 {
  (a): any;
}

type F3 = F1 | F2;
const f: F3 = (a) => {
  console.log(123, a);
}

const isF2 = (a): a is F2 => true; // Typeguard
if (isF2(f)) { 
  f(1); // OK
}

您要寻找的是&运算符或intersection type

interface F1 {
  (a, b): any;
}

interface F2 {
  (a): any;
}

type F4 = F1 & F2;
const g: F4 = (a) => {
  console.log(123, a);
}

g(1); // OK

您可以在此Typescript playground

中使用这些示例。