【发布时间】:2020-07-12 22:01:28
【问题描述】:
我在使用如下泛型重载函数时遇到了问题 (playground)。
泛型类型T1 没有在参数中使用(仅用于返回类型),所以当我尝试使用重载#2 时,我必须提供像f<string, string>('123') 这样的所有类型,这有时是不可能的。有没有办法让f<string>('123')匹配overload #2?
function f<T1, T2>(t2: T2): T1
function f<T1>(): T1
function f<T1, T2>(t2?: T2): T1 | void {
}
f<string, string>('123') // ok
f<string>() // ok
f<string>('123') // error here, can we fix it by not using f<string, string>('123') ?
function f<T1, T2>(t2: T2): T1
function f<T1>(): T1
function f<T1, T2>(t2?: T2): T1 | void {
}
f < string, {id: number}>({id: 123}) // ok
f<string>() // ok
f<string>({id:123}) // typescript complain here can we fix it by not using f<string, string>({id:123}) ?
【问题讨论】:
-
嗯,我曾想过类似
function f<T1, T2 = unknown>(t2?: T2): T1但f<string>('123')将'123'视为unknown而不是string... -
嗨,我想补充一件事 - 如果这很难理解和执行,也许你不应该让你的代码做到这一点,只需将
f更改为两种方法以不同的方式处理代码 - 这样可以避免此问题并提高可读性 -
@MorShemesh,很好的建议。实际上上下文是它是一个可选配置,共享相同的名称是有意义的。但如果我真的不能锻炼,我会选择你的建议。谢谢。
标签: typescript overloading generic-type-parameters