具有多个调用签名的 TypeScript 接口
Posted
技术标签:
【中文标题】具有多个调用签名的 TypeScript 接口【英文标题】:TypeScript interface with multiple call signatures 【发布时间】:2017-09-13 10:15:19 【问题描述】:我在 TypeScript 2.2 中看到了通过定义的接口调用签名“重载”函数的选项,我花了很长时间来了解如何使用它。
所以在处理它并“破解”它之后,我认为值得在这里发布它。
我开始的问题是,例如:
interface Func1
(num1: number, num2: number): number;
(str1: number, str2: string): string;
function F1(num1: number, num2: number): number
return num1 + num2;
const f1: Func1 = F1;
console.log(f1(1, 2));
但是编译器没有通过它,因为Func1
不能接受F1
函数。
我想做重载,不知道怎么办。
请参阅下面的答案。
【问题讨论】:
【参考方案1】:在挖掘它之后,我发现我们可以做相当多的重载。 TypeScript 中的重载与任何其他 javascript 代码没有什么不同。它必须在 一个 函数中实现,而不是在多个函数中实现,例如在 C++
中。你需要让你的函数接受所有选项。
例如:
interface Func1
(v1: number, v2: number): number;
(v1: string, v2: string): string;
const f1: Func1 = (v1, v2): any =>
return v1 + v2;
;
console.log(f1("1", "2"));
console.log(f1(1, 2));
函数f1
假设重载接口调用签名的所有选项都有类型,如果设置强类型它将阻止你,因为类型不可转换。就像在这个例子中number
不能转换为string
。
您还可以创建多个使用接口调用签名重载的函数,并将它们传递给您的f1
,如果类型匹配,它将通过。只需确保您的函数可以处理所有接口调用签名。
在使用类或函数参数不简单时检查实现函数的类型很重要,如上例,使用typeof
并控制所有选项。
希望对您有所帮助。
【讨论】:
typeof
仅对“简单”类型有意义。如果您这样做,请不要向instanceof
检查您正在编写一个糟糕的 API。我可以并且会使用不是 instanceof
你的类的东西来调用你的 API,你将无法阻止它。
如果我想用不同的泛型参数进行重载怎么办?例如interface GenericIdentityFn <T>(arg: T): T; <T, F>(arg1: T, arg2: F): [T, F];
@FindOutIslamNow 多个同名接口默认合并,它们的泛型也是如此(也按名称)。 interface I<A>, interface I<A,B>, interface I<C> == interface I<A,B,C>
.
"运算符 '+' 不能应用于类型 'string | number' 和 'string | number'。"以上是关于具有多个调用签名的 TypeScript 接口的主要内容,如果未能解决你的问题,请参考以下文章