繁体   English   中英

如何在打字稿中正确重载具有多个参数的函数?

[英]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

这是有道理的,因为如果arrT类型,则el不应该是string类型,但联合使它成为“可能性”。

那么我如何正确输入这里的实现来说明参数可能是T[] and Tstring and string

调用arr.indexOf(el)是不安全的,其中arrT | string[] T | string[]elT | string T | string因为编译器不确定您是否不匹配它们,如"typescript".indexOf(2)[1,2,3].indexOf("rip") arrel的类型应该相关这一事实在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM