Шаблон, который вы описываете, называется областным безопасным конструктором .Это может быть реализовано путем перегрузки конструктора, чтобы он работал с и без ключевого слова new
.
interface User {
name: string;
}
interface UserConstructor {
new (name: string): User;
(name: string): User;
}
Тот же трюк используется для глобальных объектов, таких как Array
или Date
.
Нам необходимо выяснить, использовалось ли ключевое слово new
:
const User = function (this: User | void, name: string): User {
if (!(this instanceof User)) {
return new User(name);
}
this.name = name;
return this;
} as UserConstructor;
Ваш класс только что стал new
-агностическим.
console.log(
new User('Bob'),
User('Alice'),
);
Что позволило нам написать:
['Alice', 'Bob'].map(User); // $ExpectType User[]