Typescript, как добавить свойства в конструктор объектов?

Мне нужно добавить свойства в 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;
  }
}

Можете ли вы объяснить, как бы вы использовали такую ​​​​вещь? Отличается ли это от простого предоставления вашему явному классу некоторых static свойств?

jcalz 21.12.2020 20:27

@jcalz добавил пример использования

kevzettler 21.12.2020 22:05

Почему нельзя просто добавить поле экземпляра behaviors: string[] в Entity? Если вы задаетесь вопросом "Как изменить тип конструктора глобального объекта?" тогда вы, вероятно, делаете действительно трудный путь.

Alex Wayne 04.01.2021 21:53
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
3
1 165
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать что-то вроде:

type EntityConstructor = Function & {behaviors: string[]}

declare global {
  interface O extends Object {
    constructor: EntityConstructor
  }
}

Но вам нужно будет создать еще один класс, который расширяет Object. Насколько я могу судить, на самом деле нет способа сделать то, что вы просите, без изменения самого исходного интерфейса Object/файла d.ts или создания отдельного класса, который расширяет Object.

Вот несколько полезных ответов на связанный вопрос о переопределении типов свойств интерфейса

Другие вопросы по теме