Я думаю, ты выглядишь примерно так:
function decorate(typ: string) {
return function <T extends {new (...args) }>(cls: T): T & { type: string } {
return class extends cls {
static type: string = typ;
}
}
}
@decorate("")
class Foo {
static bar() {
return 42
}
}
Foo.type // ''
Странные части:
(arg: T)
означает, что arg является экземпляром класса T. arg: { new (...args): T}
означает, что arg является классом T (не экземпляром)
&
оператор - это типы слияния из двух интерфейсов, например { key1: string } & { key2: number }
равно { key1: string, key2: number }
return class extends cls
означает, что мы возвращаем анонимный класс, который расширяет cls
(в этом случае Foo
). Мы добавляем к нему статический тип: string, потому что мы принудительно добавили T & { type: string }
part
Детская площадка