Тип универсального вызываемого конструктора 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
Почти уверен, что есть и другие улучшения, не стесняйтесь комментировать