Это, наверное, невозможно, но я все равно пытаюсь. Я хотел бы сделать функцию примерно такой, как этот псевдокод:
function modifyClass<MOD_ME extends SomeClass>(
baseClass: typeof MOD_ME,
args: ...MOD_ME.arguments
): MOD_ME {
args[1] = "second arg is always this string";
return new baseClass(...args);
}
Цель этого состоит в том, чтобы иметь возможность делать что-то примерно похожее на декораторы, без всяких прототипов. Я хочу иметь возможность проверки типов при упаковке конструктора класса. Такой вызов функции:
import MyClass from "./MyClass"
import modifyClass from "./modifyClass"
const moddedClassInstance = modifyClass(MyClass, myClassArg1, myClassArg2);
Самая большая проблема, с которой я сталкиваюсь, - это получение типов для аргументов того, что является базовым классом. Возможно ли это?
Вы можете сделать это в версии 3.0, используя условные типы и Кортежи в остальных параметрах и выражениях распространения.
type CtorArgumentTypes<T extends new (...args: any[]) => any> = T extends new (...args: infer A) => any ? A : []
function modifyClass<MOD_ME extends new (...args: any[]) => any>(
baseClass: MOD_ME,
...args: CtorArgumentTypes<MOD_ME>
): InstanceType<MOD_ME> {
return new baseClass(...args);
}
class Test {
constructor(public n: number, public s: string) {
}
}
let o = modifyClass(Test, 10, ""); //ok
let o2 = modifyClass(Test, "", ""); // error
Вот это да. Святая корова. Это впечатляющее знание машинописного текста.
InstanceType
иinfer
- два ключевых слова, которых я никогда не видел. Спасибо.