Typescript如何向对象构造函数添加属性?

Posted

技术标签:

【中文标题】Typescript如何向对象构造函数添加属性?【英文标题】:Typescript how to add properties to Object constructor? 【发布时间】:2021-03-31 13:37:09 【问题描述】:

我需要为特定类的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'.

我不需要这是一个覆盖它可能是一个显式类。

使用示例: 澄清我为什么以及如何想要这个属性...

我正在使用typescript mixins

我有一个方法,它采用一组 ConstrainedMixin 构造函数,将它们应用于基类,为混合类创建一个新的构造函数。然后我想将新构造函数上应用的 mixin 名称列表存储为新属性。这看起来像:

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 添加了一个使用示例 为什么不能在Entity 中添加一个实例字段behaviors: string[]?如果您问的问题是“如何更改全局对象构造函数的类型?”,那么您可能正在做真的困难的方式。 【参考方案1】:

你可以按照以下方式做一些事情:

type EntityConstructor = Function & behaviors: string[]

declare global 
  interface O extends Object 
    constructor: EntityConstructor
  

但您需要创建另一个扩展Object 的类。据我所知,如果不更改原始Object 接口本身/ d.ts 文件或创建一个扩展Object 的单独类,就没有真正的方法可以满足您的要求。

以下是有关Overriding Interface Property Types 上相关问题的一些有用答案

【讨论】:

以上是关于Typescript如何向对象构造函数添加属性?的主要内容,如果未能解决你的问题,请参考以下文章

python0.16------构造函数/析构函数/self详解/重写/访问限制/对象属性和类属性/@property/运算符重载

php 中构造函数和析构函数

面向对象3

TypeScript,面向对象,类、构造函数、继承、抽象类、接口和封装

PHP面向对象——构造函数析构函数

如何在不破坏移动和复制构造函数的情况下声明虚拟析构函数