我有一个泛型函数foo()
,它有一个可选参数fn
,可以是一个转换返回值的函数。如果未提供fn
,则只需使用string
。比如说
const foo = <T>(fn?: (data: string) => T) => {
const data = "some data"
if (!fn) {
return String(data)
}
return fn(data)
}
字符串
我很难让泛型正确地推断返回值。如果未提供fn
,则返回值应推断为string
。如果是,则返回值应推断为fn
的任何返回类型。
目前,如果我调用foo()
,返回类型是unknown
。如果我提供一个fn
,返回类型总是推断为string | (return type of fn)
,在这种情况下,应该删除string
。
2条答案
按热度按时间watbbzwu1#
如果我理解正确的话,TS中有一些变通方法可以使用
conditional types
和function overloads
来实现您的目标。通过使用函数重载,可以根据是否提供fn参数来定义不同的返回类型。字符串
你可以在那里玩
z9smfwbn2#
您可以为泛型
T
设置一个默认值,就像您的例子中的T = string
一样。当一个参数被传递给你的函数foo
时,它的返回类型将是T
。如果不带任何参数调用foo
,则T
的默认值将是返回类型string
。字符串
TypeScriptPlayground