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?) {
}
我不太喜欢。任何帮助/反馈将不胜感激。
答案 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
中使用这些示例。