Мне нужно добавить свойства в Object.constructor
для определенного класса.
Я использую lib.es5.d.ts
Я попытался переопределить глобальный объект, например:
type EntityConstructor = Function & {behaviors: string[]}
declare global {
interface Object {
constructor: EntityConstructor
}
}
Это вызывает ошибку:
Subsequent property declarations must have the same type.
Property 'constructor' must be of type 'Function', but here has type 'EntityConstructor'.
Мне не нужно, чтобы это было переопределением, это может быть для явного класса.
ПРИМЕР ИСПОЛЬЗОВАНИЯ: Чтобы уточнить, почему и как я хочу эту собственность...
Я использую машинописные миксины
У меня есть метод, который принимает набор конструкторов ConstrainedMixin
, применяет их к базовому классу, чтобы создать новый конструктор для смешанного класса. Затем я хочу сохранить список примененных имен миксинов в этом новом конструкторе как новое свойство. Это выглядит так:
import compose from 'lodash.flowright';
export type ConstrainedMixin<T = {}> = new (...args: any[]) => T;
class Entity {
static behaves(...behaviors: Array<ConstrainedMixin>){
const newEnt = compose.apply(
null,
behaviors,
)(Entity);
newEnt.behaviors = behaviors.map((behaviorClass) => behaviorClass.name);
return newEnt;
}
}
@jcalz добавил пример использования
Почему нельзя просто добавить поле экземпляра behaviors: string[]
в Entity
? Если вы задаетесь вопросом "Как изменить тип конструктора глобального объекта?" тогда вы, вероятно, делаете действительно трудный путь.
Вы можете сделать что-то вроде:
type EntityConstructor = Function & {behaviors: string[]}
declare global {
interface O extends Object {
constructor: EntityConstructor
}
}
Но вам нужно будет создать еще один класс, который расширяет Object
. Насколько я могу судить, на самом деле нет способа сделать то, что вы просите, без изменения самого исходного интерфейса Object
/файла d.ts или создания отдельного класса, который расширяет Object
.
Вот несколько полезных ответов на связанный вопрос о переопределении типов свойств интерфейса
Можете ли вы объяснить, как бы вы использовали такую вещь? Отличается ли это от простого предоставления вашему явному классу некоторых
static
свойств?