Typescript泛型可调用构造函数类型

Typescript泛型可调用构造函数类型,typescript,generics,callable,newable,Typescript,Generics,Callable,Newable,typescript是否提供了任何方法来以通用方式正确键入可调用构造函数 下面的代码可以工作,但有一些问题。 似乎您无法通过声明类或接口修改构造函数返回类型。 我试着玩混音器,但没能让它工作 interface Callable<T> { (): T; (value:T): this; } declare class O<T> { constructor(value:T); } function O<T>(value:T) : Ca

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
接口可调用{
():T;
(值:T):这个;
}
申报O类{
构造函数(值:T);
}
函数O(值:T):可调用{
设_值=值;
//我们能摆脱这个角色吗?
常量可调用=函数(值?:T){
如果(值===未定义){
返回_值;
}
_价值=价值;
返回可调用;
};
setPrototypeOf(可调用,O.prototype);
返回可调用;
}
//我们能摆脱这种类型和/或使其通用吗?
const instance=newo(false)可调用;
常量a=instance();//假的
实例(真);
常量b=instance();//真的
常数c=O的实例实例;//真的

非常确定还有其他改进需要改进,请随意评论

我不确定您需要什么要求。调用
instance()
是否返回
O
的新实例,还是只返回当前存储的值(在本例中为true或false)。您的代码无效。这很难理解,我相信这是有效的javascript,但我正在努力为它打字。虽然它可能是边缘的情况?实例化类将设置初始值。那么实例基本上就是一个get或set。未获取参数,已设置参数。运行它,您将看到它的功能:-)