Проблема с типами TypeScript

Пытаюсь сделать миксин (примесь) на TypeScript. Функция Peekable принимает на вход конструктор класса, содержащий метод next() который возвращает нейкий тип U и добавляет к этому классу новый метод peek() который также должен возвращать тип U. Однако когда я пытаюсь использовать тип U в теле самой функции, компилятор не распознает этот тип, пишет что он не был определён.

type ClassConstructor<T> = new(...args: any[]) => T

function Peekable<T extends ClassConstructor<{
    next<U>(): U
}>>(Class: T) {
    return class extends Class {

        public peek(): U {
            //...
        }

        public next(): U {
            //...
        }

    }
}

P.S. edit

как правильно мне указали в комментариях, я добился задачи следующим образом: обьявив тип U рядом с типом T:

type ClassConstructor<T> = new(...args: any[]) => T

function Peekable<T extends ClassConstructor<{
    next(): U
}>, U> (Class: T) {
    return class extends Class {
        private current: U | null = null

        public peek(): U {
            return this.current ?? (this.current = super.next())
        }

        public next(): U {
            const val = this.current
            this.current = null
            return val ?? super.next()
        }

    }
}

class CharStream {
    private position = 0

    constructor(private readonly source: string) {}

    public next(): string {
        return this.source.charAt(this.position++)
    }
}

const stream = new (Peekable<typeof CharStream, string>(CharStream))('Hello, world!')

console.log(stream.peek()) //'H'

Однако, мне пришлось вручную указывать типы Peekable<typeof CharStream, string>(CharStream), т.е. в данном случае тип метода next() зависит от типа, передаваемого в Peekable. Если я не указываю типы компилятору явно, то он выводит тип Peekable<typeof CharStream, unknown>. Я бы хотел знать, может ли typescript сам вывести тип Peekable на основании возвращаемого типа метода next() родительского класса? Без unknown


Ответы (0 шт):