【问题标题】:Create a new instance using the type of a parameter in generic function使用泛型函数中的参数类型创建一个新实例
【发布时间】:2020-01-09 10:55:59
【问题描述】:

我实现了一个通用函数来将选项与默认选项合并:

  // definition
  protected defaultOptions<T>(options: T, type: new () => T): T {
    return {
      ...options,
      ...new type(),
    };
  }

它就像一个魅力,但我总是需要将类型作为第二个参数传递:

  // use it like this
  upload(file: File, options: FilesUploadOptions) {
    options = this.defaultOptions(options, FilesUploadOptions);
    ...
    ...
  }

问题:

有一种方法可以达到相同的结果,但删除方法 defaultOptions 的第二个参数并使用第一个参数的类型获取并创建新实例?

  // definition
  protected defaultOptions<T>(options: T): T {

    const type = ???????; // some smart type generics here :)

    return {
      ...options,
      ...new type(),
    };
  }

通过这种方式,我可以像这样简单地使用它:

  upload(file: File, options: FilesUploadOptions) {
    options = this.defaultOptions(options);
    ...
    ...
  }

谢谢!

【问题讨论】:

  • TypeScript 编译为 JavaScript,这是实际运行的。你会如何想象这在 JavaScript 中工作?你可能会做类似new options.constructor() 的事情,假设options 参数本身是一个零参数构造函数的类实例,但TypeScript 将无法验证这是否有效。
  • 这是一个相关问题,解决了打字稿无法验证此类事情的原因:stackoverflow.com/questions/36138095/…。基本上,constructor 的类型就是Function,但是constructor 函数在javascript 中有特殊的行为(它是新的)。即使使用最新版本的打字稿,情况仍然如此。

标签: typescript typescript-generics


【解决方案1】:

有一种方法可以达到相同的结果,但是删除方法 defaultOptions 的第二个参数并使用第一个参数的类型获取并创建新实例?

不,那是不可能的。在 TypeScript 中,类型是纯粹的编译时构造。当编译成 JavaScript 时,它们会被移除。这意味着在运行时无法访问它们。

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多