无法从类字典扩展类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法从类字典扩展类相关的知识,希望对你有一定的参考价值。

ISSUE:

我试图从更高阶类方法返回一个类声明,该方法从类映射扩展一个类{"SOME_CLASS" : SomeClass},其中key是高阶类方法的参数。然而,Typescript却抛出了这个错误...... 注意:我没有使用任何外部库。

ERROR:

不能对类型缺少调用或构造签名的表达式使用“new”。

ATTEMPTS:

我试图将类类型转换为“可更新”但是我丢失了对正在扩展的类的类型绑定。

SNIPPET

/// Contrived Example
interface BaseConfig {
  options: {
    profileHref: string
  }
}
abstract class Base { /*< BaseClass Implementations >*/
}
/// Example Class 1
class ProfileIcon extends Base {
  constructor(config: {
    options: {
      profileHref: string
    }
  }) {
    super(config);
  }
}
/// Example Class 2
class ScriptBlock extends Base {
  constructor(config: {
    options: {
      src: string
    }
  }) {
    super(config);
  }
}
}

class Manager {
  protected STORE: RootStore;
  constructor() {}
  public dispatchNewElement(elementType: keyof typeof ELEMENT_MANIFEST) {
    const storeShard = this.STORE.shard();
    const elementClass = ELEMENT_MANIFEST[elementType];


    /*
    //// ERROR: type 'typeof ProfileIcon | typeof ScriptBlock' is not a constructor function type.
    /// NOTE: 
    >> const T = new elementClass(...args)
    >> throws - Cannot use 'new' with an expression whose type lacks a call or construct signature.
    ////
    ////
    */

    return class extends /*err*/ elementClass /*endErr*/ {
      protected STORE_SHARD: typeof RootStore;
      constructor(elementConfig: { < unique fields to class implementation >
      }) {
        super(elementConfig);
        this.STORE_SHARD = storeShard;
      }
    }
  }

  /// Element Class Dictionary
  const ELEMENT_MANIFEST = {
    "PROFILE_ICON": ProfileIcon,
    "SCRIPT_BLOCK": ScriptBlock
  }

请原谅任何错误格式化,这可能是我关于堆栈溢出的第二篇文章。干杯!

UPDATE from Comments

类返回类扩展另一个类的示例

class Master {
    public STATE: any;
    constructor() {
        this.STATE = { name: "foo" };
    }
    public dispatchNewClass(classType: string) {
        const myRefImage = Img;
        ////
        /* Works as a refVariable however..
        if i declare like...
            const myRefImage: Icon | Img
        I will get  
        >> Type 'typeof Img' is not assignable to type 'Icon | Img'.  
        >> Type 'typeof Img' is not assignable to type 'Img'.  
        >>Property 'TagName' is missing in type 'typeof Img'.
        */
        ///
        const asObject {}
        const ROOT = this.STATE;
        return class Slave extends myRefImage {
            protected ROOT: typeof ROOT;
            constructor(tagName: string) {
                super(tagName as "img")
                this.ROOT = ROOT;
            }
        }
    }
}
答案

这在TypeScript中不起作用。

TypeScript中的类型系统仅在编译时存在。

编译代码时,它是纯javascript

您无法定义新类和/或从仅在运行时知道的另一个类扩展它。

以上是关于无法从类字典扩展类的主要内容,如果未能解决你的问题,请参考以下文章

我如何从类扩展 ChangeNotifier 中获取价值

无法从类加载器中找到 QueryDsl JPAQueryFactory

从类更新所有扩展视图会导致延迟?

无法使用 java swing 从类路径渲染图像?

无法从类内部调用 ExtJS 类中的方法

无法从类路径上的 /AwsCredentials.properties 文件加载 AWS 凭证