【发布时间】:2019-03-05 14:26:29
【问题描述】:
我有以下代码,它可以采用可迭代或异步可迭代并返回相同类型的对象。它还有一个可以选择柯里化的数字。
function _buffer<T>(size: number, iterable: AsyncIterable<T>): AsyncIterableIterator<T> {
throw new Error('not important')
}
function* syncBuffer<T>(size: number, iterable: Iterable<T>): IterableIterator<T> {
throw new Error('not important')
}
export function buffer<T>(
size: number
): {
(curriedIterable: AsyncIterable<T>): AsyncIterableIterator<T>
(curriedIterable: Iterable<T>): IterableIterator<T>
(curriedIterable: Iterable<T> | AsyncIterable<T>): Iterable<T> | AsyncIterable<T>
}
export function buffer<T>(size: number, iterable: AsyncIterable<T>): AsyncIterableIterator<T>
export function buffer<T>(size: number, iterable: Iterable<T>): IterableIterator<T>
export function buffer<T>(size: number, iterable: Iterable<T> | AsyncIterable<T>): Iterable<T> | AsyncIterable<T>
export function buffer<T>(size: number, iterable?: Iterable<T> | AsyncIterable<T>) {
if (iterable === undefined) {
return <R>(curriedIterable) => buffer<R>(size, curriedIterable)
}
if (iterable[Symbol.asyncIterator]) {
return _buffer(size, iterable as AsyncIterable<T>)
}
return syncBuffer(size, iterable as Iterable<T>)
}
function run(a: AsyncIterable<any>) {
return buffer(4, a)
}
function run(a: AsyncIterable<any> | Iterable<any>) {
return buffer(4, a)
return buffer(4)(a)
}
但是我在编译时收到以下类型错误。
Overload signature is not compatible with function implementation.ts(2394)
// in reference to
export function buffer<T>(size: number, iterable: Iterable<T> | AsyncIterable<T>): Iterable<T> | AsyncIterable<T>
但情况似乎并非如此?如果我删除该重载签名,当我不知道它是哪个时,我无法使用联合调用该函数。
【问题讨论】:
-
顺便说一句,有时当您发现自己担心参数类型的重载和联合时,这表明您应该改用泛型和条件类型。也就是说,重载
f(a: T): U; f(a: V): W;可以替换为f<X extends T | V>(a: X): X extends T ? U : W;之类的东西,并且您可以免费获得工会的电话。但这条路线可能会让你更困惑,所以除非你真的需要,否则我不会详细说明。 -
请详细说明!我很想在这里了解更多信息。
标签: typescript typescript-generics