Вы не можете расширять условный тип, Typescripts ожидает, что предложение в предложении extends
будет конструктором, а не любым другим более сложным типом.
Я думаю, что самым простым решением в этом случае было былгать компилятору с утверждением типа:
interface Test {
readonly __TEST: "test";
new(...args: any[]): {
readonly test: "test";
};
}
function TestMixin<SuperClass extends new (...args: any[]) => any = new () => {}>(
superClass?: SuperClass
) {
const defaultClass = class { };
/* ok */
const sc = (superClass === undefined ? defaultClass : superClass) as SuperClass;
/* Ok now */
class T extends sc implements InstanceType<Test> {
public static readonly __TEST = "test";
public readonly test = "test";
}
return T;
}
let a = TestMixin();
new a().test;
let b = TestMixin(class {
constructor(n: number) { console.log("Hi") }
m() { }
});
new b(1).test;
new b(1).m();
Пока никто не указывает явный параметр типа для TestMixin
и пропускает параметр, он должен работать нормально.