Тип универсального вызываемого конструктора Typescript

Предоставляет ли машинописный текст какие-либо средства для правильного ввода вызываемого конструктора в общем виде?

Приведенный ниже код работает, но имеет несколько проблем. Кажется, вы просто не можете изменить возвращаемый тип конструктора через объявляющий класс или интерфейс. Я пытался поиграть с миксином, но не смог заставить его работать.

      interface Callable<T> {
    (): T;
    (value:T): this;
}

declare class O<T> {
    constructor(value:T);
}

function O<T>(value:T) : Callable<T> {

    let _value = value;

    // can we get rid of this cast ? 
    const callable = <Callable<T>> function(value?:T){
        if(value === undefined){
            return _value;
        }
        
        _value = value;
        return callable;
    };

    Object.setPrototypeOf(callable, O.prototype);

    return callable;
}

// can we get rid of this cast and/or make it generic ? 
const instance = new O(false) as Callable<boolean>;
const a = instance(); // false
instance(true);
const b = instance(); // true
const c = instance instanceof O; // true

Почти уверен, что есть и другие улучшения, не стесняйтесь комментировать

0 ответов

Другие вопросы по тегам