![](/img/trans.png)
[英]How to overload function in TypeScript with optional parameters?
[英]How to overload a function with multiple parameters correctly in typescript?
我正在尝试定义一个函数includes
,它适用于数组和字符串。
但是我无法正确输入它。 如果我理解正确,则可以使用联合进行重载。 所以这就是我正在尝试的:
// Declarations
export function includes<T>(arr: T[], el: T): boolean;
export function includes(str: string, substr: string): boolean;
// Implementation
export function includes<T>(arr: T[] | string, el: T | string) {
return arr.indexOf(el) !== -1;
}
但我收到错误:
'string' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype
这是有道理的,因为如果arr
是T
类型,则el
不应该是string
类型,但联合使它成为“可能性”。
那么我如何正确输入这里的实现来说明参数可能是T[] and T
或string and string
?
调用arr.indexOf(el)
是不安全的,其中arr
是T | string[]
T | string[]
和el
是T | string
T | string
因为编译器不确定您是否不匹配它们,如"typescript".indexOf(2)
或[1,2,3].indexOf("rip")
。 arr
和el
的类型应该相关这一事实在 TypeScript 中很难表达。 在没有相关记录类型的情况下(参见 microsoft/TypeScript#30581) ],在实现中使用any
或其他变通方法等不太安全的事情是合理的,因为重载调用签名可以防止调用者看到任何此类不健全的情况你的功能。
但是,在您的情况下,我倾向于使用以下实现签名:
export function includes<T>(arr: { indexOf(x: T): number }, el: T) {
return arr.indexOf(el) !== -1;
}
在这里,我们只关心arr
有一个indexOf()
方法,它接受某种类型T
的值并返回一个number
,而el
是一个T
。 这使得arr.indexOf(el)
编译都不会出错,并且它与两个重载调用签名兼容。 事实上,您甚至可能想要放弃重载而只使用上面的定义,除非您有某种理由将 contains includes()
限制为string
- 或 - Array<T>
输入。 让我们确保它的行为:
includes("typescript", "rip"); // okay
includes([1, 2, 3], 2); // okay
includes("typescript", 2); // error
includes([1, 2, 3], "rip"); // error
在我看来很好。 希望有所帮助; 祝你好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.