Ошибка несовместимости типов при использовании T [keyof T] внутри класса, который сам используется как тип - PullRequest
1 голос
/ 09 июля 2020
class Processor<T extends object> {
    data!: T;
    test (i : keyof T) : T[keyof T] | undefined {
        return this.data[i];
    }
}

class BaseRunner<
    T extends object,
    P extends Processor<T>
>  {
    proccessor!: P;
    constructor (proccessor : P) {
        this.proccessor = proccessor;
    }
}

class DerivedRunner<
    T extends object,
    P extends Processor<T>
> extends BaseRunner<T, P> {}

const instanceOne : typeof BaseRunner = DerivedRunner;


interface ctor<T extends object, P extends Processor<T>> {
    new(proccessor : P) : BaseRunner<T, P>
}

const instanceTwo : ctor<object, Processor<object>> = DerivedRunner;

Цель состоит в том, чтобы присвоить класс DerivedRunner переменной типа BaseRunner, но это приводит к ошибке несовместимости Type 'T[keyof T] | undefined' is not assignable to type 'undefined'. с instanceOne из-за того, что T[keyof T] используется как возвращаемый тип в классе Processor, но отлично работает при назначении DerivedClass типу интерфейса конструктора BaseRunner, как в случае с instanceTwo. Насколько я понимаю, typeof BaseRunner должен генерировать одну и ту же сигнатуру конструктора, так почему же есть это несоответствие между двумя экземплярами.

...