Это вроде возможно, но не рекомендуется, согласно microsoft / TypeScript # 2310 . Согласно команде TS, если вы используете TypeScript, вы должны использовать class
напрямую. Он будет скомпилирован как есть, если вы нацелены на ES2015 или выше, или он скомпилируется до функции, которую вы упомянули, если вы нацелены на ES5.
Если вы хотите проигнорировать рекомендацию, вы должны сделать некоторые аннотации типов и утверждения, чтобы получить желаемое поведение, и в результате в скомпилированном выводе останется небольшой, но неиспользуемый код времени выполнения. И это не будет особенно безопасно для типов (если вы допустите ошибку при наборе текста, компилятор не будет жаловаться).
Сначала вы должны вручную определить интерфейс вашего экземпляра класса, так как компилятор не может сделайте для вас вывод:
interface Person {
name: string;
}
Затем вы должны задать для своей функции this
параметр , чтобы компилятор понимал, что внутри реализации вашей функции значение this
следует рассматривать как экземпляр вашего класса. Вам также следует переименовать функцию из Person
во что-то другое (например, _Person
), потому что вы не сможете изменить ее тип на что-то new
-можное после факта:
function _Person(this: Person, name: string) {
this.name = name;
}
Наконец, вы можете определить Person
как const
, значение которого совпадает с вашей переименованной функцией во время выполнения, но во время компиляции вы даете ей сигнатуру конструктора:
const Person = _Person as any as new (name: string) => Person;
Теперь он настроен так, что Person
является функцией во время выполнения (не class
, даже если вы нацелены на ES2015 +), но чтобы компилятор воспринимал ее как конструктор:
const p = new Person("Alice");
console.log(p.name); // Alice
Итак, ура? Бороться с таким компилятором и «побеждать», вероятно, не стоит в любых производственных условиях. Но интересно посмотреть, как это сделать, я думаю.
Хорошо, надеюсь, это поможет; удачи!
Детская площадка ссылка на код