解决 TypeScript 中 Not all constituents of type 'X | Y' are callable 错误
“This expression is not callable. Not all constituents of type 'X | Y” are callable”的错误出现在一个值可能是多种类型时,其中一些类型不是函数。要解决该错误,请使用类型保护来使 在调用它之前确保该值是一个函数。
以下是发生上述错误的一个示例:
// 👇️ returns string OR function
function example() {
return [
'hello',
function sum(a: number, b: number) {
return a + b;
},
];
}
// 👇️ sum is string OR function
const [str, sum] = example();
// ⛔️ Error: This expression is not callable.
// Not all constituents of type 'string | ((a: number, b: number) => number)' are callable.
// Type 'string' has no call signatures.ts(2349)
console.log(sum(15, 30));
该函数返回一个包含字符串和函数的数组。
这里的问题是函数的返回值被键入为 (string | ((a: number, b: number) => number))[]
,换句话说 - 一个包含字符串或函数的数组。
通过组合两个或多个其他类型形成的类型在 TypeScript 中称为联合类型。
我们需要一种方法来告诉编译器我们确定我们尝试调用的值是一个函数。
要解决此特定场景中的错误,请使用 const
断言。
// 👇️ returns tuple with 1st element string
// and second element function
function example() {
return [
'hello',
function sum(a: number, b: number) {
return a + b;
},
] as const; // 👈️ const assertion
}
// 👇️ sum is function
const [, sum] = example();
// ✅ works as expected
console.log(sum(15, 30));
const
断言将函数的返回值从包含字符串或函数元素的数组更改为包含字符串第一个元素和函数第二个元素的元组。
另一种方法是使用类型保护并在调用它之前确保该值是一个函数。
function example() {
return [
'hello',
function sum(a: number, b: number) {
return a + b;
},
];
}
// 👇️ sum is string or function
const [, sum] = example();
if (typeof sum === 'function') {
// 👇️ sum is function here
// ✅ works as expected
console.log(sum(10, 15));
}
在接口或类型别名中使用联合类型时,我们也可能会遇到错误。
interface Person {
[key: string]: string | ((a: number, b: number) => number);
}
const person: Person = {
sum(a: number, b: number) {
return a + b;
},
};
// ⛔️ Error: Not all constituents of type
//'string | ((a: number, b: number) => number)' are callable.
person.sum(100, 200);
上面的示例使用联合类型和索引签名来指定
Person
类型可以具有任何名称的属性,只要它们具有字符串类型或函数类型即可。
TypeScript 警告我们对象中的属性可能是字符串类型,因此我们不能在不确定它是函数的情况下直接调用它。
要解决这个问题,请使用 typeof
运算符并检查该值是否为函数。
interface Person {
[key: string]: string | ((a: number, b: number) => number);
}
const person: Person = {
sum(a: number, b: number) {
return a + b;
},
};
if (typeof person.sum === 'function') {
person.sum(100, 200);
}
更好的解决方案是更具体并为类型设置特定的属性名称,因为我们可能在接口中有多个函数采用不同类型的参数。
interface Person {
[key: string]: string | ((a: number, b: number) => number);
sum: (a: number, b: number) => number; // 👈️ added this
}
const person: Person = {
sum(a: number, b: number) {
return a + b;
},
};
// ✅ Works as expected
console.log(person.sum(10, 20));
现在 TypeScript 知道对象的 sum 属性将是一个函数,它不能是一个字符串。
总结
“This expression is not callable. Not all constituents of type 'X | Y” are callable”的错误出现在一个值可能是多种类型时,其中一些类型不是函数。要解决该错误,需要使用类型保护来使 在调用它之前确保该值是一个函数。
相关文章
在 AngularJs 中设置 Select From Typescript 的默认选项值
发布时间:2023/04/14 浏览次数:78 分类:Angular
-
本教程提供了在 AngularJs 中从 TypeScript 中设置 HTML 标记选择的默认选项的解释性解决方案。
在 Angular 中使用 TypeScript 的 getElementById 替换
发布时间:2023/04/14 浏览次数:153 分类:Angular
-
本教程指南提供了有关使用 TypeScript 在 Angular 中替换 document.getElementById 的简要说明。这也提供了在 Angular 中 getElementById 的最佳方法。
在 TypeScript 中使用 try..catch..finally 处理异常
发布时间:2023/03/19 浏览次数:181 分类:TypeScript
-
本文详细介绍了如何在 TypeScript 中使用 try..catch..finally 进行异常处理,并附有示例。
在 TypeScript 中使用 declare 关键字
发布时间:2023/03/19 浏览次数:97 分类:TypeScript
-
本教程指南通过特定的实现和编码示例深入了解了 TypeScript 中 declare 关键字的用途。
在 TypeScript 中 get 和 set
发布时间:2023/03/19 浏览次数:172 分类:TypeScript
-
本篇文章演示了类的 get 和 set 属性以及如何在 TypeScript 中实现它。
在 TypeScript 中格式化日期和时间
发布时间:2023/03/19 浏览次数:161 分类:TypeScript
-
本教程介绍内置对象 Date() 并讨论在 Typescript 中获取、设置和格式化日期和时间的各种方法。
在 TypeScript 中返回一个 Promise
发布时间:2023/03/19 浏览次数:182 分类:TypeScript
-
本教程讨论如何在 TypeScript 中返回正确的 Promise。这将提供 TypeScript 中 Returns Promise 的完整编码示例,并完整演示每个步骤。
在 TypeScript 中定义函数回调的类型
发布时间:2023/03/19 浏览次数:221 分类:TypeScript
-
本教程说明了在 TypeScript 中为函数回调定义类型的解决方案。为了程序员的方便和方便,实施了不同的编码实践指南。
在 TypeScript 中把 JSON 对象转换为一个类
发布时间:2023/03/19 浏览次数:110 分类:TypeScript
-
本教程演示了如何将 JSON 对象转换为 TypeScript 中的类。