Проблема с типами 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