我做了下面的代码实现无限currying的路径连接。
function joinPath(): string
function joinPath(a: string): typeof joinPath
function joinPath(a?: string): string | typeof joinPath {
if (a === undefined) { return '' }
const func = (b?: string) => {
if (b === undefined) { return a }
return joinPath(`${a}/${b}`)
}
return func as typeof joinPath
}
console.log(joinPath('www.github.com')()) // www.github.com
console.log(joinPath('www.github.com')('react')) // www.github.com/react
joinPath
的结果不是文本类型,而是字符串类型。
例如joinPath('facebook')(): string // not 'facebook'
我怎样才能使结果为文本类型呢?看来我必须使用泛型类型,但是我找不到工作的方法。
我尝试使用泛型类型将结果类型设置为文本,但没有成功。
1条答案
按热度按时间7hiiyaii1#
为了跟踪字符串的字面类型,你需要
joinPath
的类型本身是generic,因为用另一个字符串调用结果函数会产生修改那个字符串的效果,你会希望joinPath
的类型是一个递归的泛型类型,最简单的方法是使用一个命名的接口,比如:所以
JoinPath<T>
保留字符串类型T
,如果不带参数调用它,结果是T
,否则,如果带泛型类型U
的参数调用它,结果是string
,这里我们使用template literal type来表示T
与U
的串联。现在您可以如下所示注解重载调用签名:
因此
joinPath()
返回空字符串"", otherwise
joinPath(a)returns
JoinPath "。让我们来测试一下:
看起来不错。在所有情况下变量的类型和变量的值都一致。
Playground代码链接