有没有办法在打字稿中实例化通用文字类型?

2024-01-10

我想做一些可能非正统的事情(如果我们诚实的话,几乎没有用),所以我们开始:

我想传递一个文字作为通用参数,然后实例化它。考虑以下示例:

const log = console.log;

class Root<T = {}> {
  // public y: T = {}; // this obviously doesn't work

  // again this won't work because T is used a value. Even if it worked,
  // we want to pass a literal
  // public y: T = new T();

  public x: T;
  constructor(x: T) {
    this.x = x;
  }
}

class Child extends Root<{
  name: "George",
  surname: "Typescript",
  age: 5
}> {
  constructor() {
    // Duplicate code. How can I avoid this?
    super({
      name: "George",
      surname: "Typescript",
      age: 5
    });
  }

  foo() {
    // autocomplete on x works because we gave the type as Generic parameter
    log(`${this.x.name} ${this.x.surname} ${this.x.age}`); 
  }
}


const main = () => {
  const m: Child = new Child();
  m.foo();
};
main();

这可行,但我必须传递文字两次。一次用于自动完成工作的泛型,一次用于初始化的构造函数。啊。

另一种方法是在之外声明我的文字Child。像这样:

const log = console.log;

class Root<T = {}> {
  // public y: T = {}; // this obviously doesn't work

  // again this won't work because T is used a value. Even if it worked,
  // we want to pass a literal
  // public y: T = new T(); 

  public x: T;
  constructor(x: T) {
    this.x = x;
  }
}

// works but ugh..... I don't like it. I don't want to declare things outside of my class
const literal = {
  name: "George",
  surname: "Typescript",
  age: 5
}
class Child extends Root<typeof literal> {
  constructor() {
    super(literal);
  }

  foo() {
    // autocomplete on x works because we gave the type as Generic parameter
    log(`${this.x.name} ${this.x.surname} ${this.x.age}`); 
  }
}


const main = () => {
  const m: Child = new Child();
  m.foo();
};
main();

有没有什么神奇的方法可以实例化泛型类型,而无需通过构造函数再次显式提供它?


您可以使用中间包装器来处理扩展泛型和调用构造函数:

function fromRoot<T>(x: T) {
  return class extends Root<T> {
    constructor() {
      super(x)
    }
  }
}

进而:

class Child extends fromRoot({
  name: "George",
  surname: "Typescript",
  age: 5
}) { etc }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法在打字稿中实例化通用文字类型? 的相关文章

随机推荐

  • 驱动器盘符更改时从 USB 驱动器运行批处理文件

    因此 我制作了一个批处理脚本 它执行多个可移植程序 例如 prog1 exe prog2 exe 等 问题是每当我将 USB 驱动器连接到另一台计算机时 驱动器号就会发生变化 从而在运行 bat 文件时出现错误 请帮我找到解决方案 谢谢 d
  • Struts 2 中的数字格式不正确

    我正在使用以下语法以正确的数字格式显示值 例如1 250 00
  • 限制可变参数模板参数

    我们可以将可变参数模板参数限制为某种类型吗 即 实现这样的目标 当然不是真正的 C struct X auto foo X args 这里我的目的是有一个接受可变数量的函数X参数 我们最接近的是 template
  • 使用辅助方法为 Java 对象生成测试数据时提供默认值

    假设有以下 POJO Getter Setter public class UserRequest private String username private String password private String email 现
  • iPhone 的 JSON 库

    我想在我的 iPhone 项目中使用 JSON 库 我发现 json framework 库是目前最流行的 在这里能找到它 http code google com p json framework http code google com
  • 使用 Java 发送零数据 TCP/IP 数据包

    我的目标是发送一个带有空数据字段的 TCP 数据包 以便测试与远程计算机的套接字 我正在使用 OutputStream 类的 write byte b 方法 我的尝试 outClient ClientSocket getOutputStre
  • Angular ng 服务不在本地主机上托管站点

    当我跑步时ng serve在我的 CLI 上 我得到以下输出 Angular Live Development Server 正在监听 localhost 4200 打开浏览器 http localhost 4200 但是当我在浏览器中打开
  • azure devops 本地代理管道权限被拒绝

    我有一个 python 脚本 可以在远程 SUT 上执行自动化脚本 并且考虑到该脚本在使用用户 tester 和密码 xxx 在本地执行时正常工作 当我构建 DevOps Azure 管道时 我已从 GIT 将项目签出到代理中 然后尝试从命
  • PHP 中传递给 exec 的命令长度有限制吗?

    目前我需要将 50 多个 PDF 文件合并为 1 个 PDF 我正在使用 PDFTK 使用以下指南 http www johnboy com blog merge multiple pdf files with php http www j
  • 如何关闭hbm2ddl?

    我找不到有关如何关闭 hbm2ddl 的参考 只是省略hibernate hbm2ddl auto默认情况下 Hibernate 不执行任何操作 来自参考文档 1 1 4 休眠配置 http docs jboss org hibernate
  • Mysql 查询发布日期减去 7 天

    这不断出现错误 我不明白为什么 SELECT i user id FROM SELECT SUM us score AS score sum us user id FROM user scores us WHERE us created g
  • 特殊字符未按预期显示

    我有以下简单的 HTML 页面 div m ywe div 当在 Chrome 或 Firefox 中显示它时 我没有测试其他浏览器 我看到以下内容 m ywe 我错过了什么 html 文件以 UTF 8
  • 将 JSON 数据写入磁盘

    编写 JSON 数据 NSDictionary 并再次读取它的最简单方法是什么 我知道有 NSFileManager 但是有没有一个开源框架库可以使这个过程变得更容易 iOS5 NSJSONSerialization 类是否支持将数据写入磁
  • 带有 jquery 的 Django 模板:现有页面上的 Ajax 更新

    我有一个带有表单的 Google App Engine 当用户单击提交按钮时 将调用 AJAX 操作 服务器将输出一些内容并附加到其来源页面的末尾 怎么样 我有一个 Django 模板 我打算使用 jquery 我有以下观点 welcome
  • 传感器的本机模块不可用。 React-Native链接运行成功了吗?

    我遵循了第一步React Native教程在这里 https facebook github io react native docs getting started html https facebook github io react
  • 在 Primefaces 中的不同布局单元之间拖放

    我在全页 Primefaces 布局中有 4 个布局单元 我在西布局单元中有输出标签 我想将其拖放到中心布局单元 我想要将输出标签拖放到此处的拖放区域是 tabView 中的一个面板 当我开始拖动outputLabel时 它不会从西布局单元
  • Snakemake:如何记录由 script 指令执行的 python 脚本?

    有没有什么方法可以轻松保存来自snakemake规则执行python脚本的日志script指示 该脚本使用的库已经有一些集成的日志记录 我想存储它们的日志 我不想使用shell or run指令 因为在使用 python 脚本时它们都不太舒
  • 用于读写的 Java FileLock

    我有一个进程 会从 cron 中频繁调用来读取其中包含某些与移动相关的命令的文件 我的进程需要读取和写入此数据文件 并将其锁定以防止其他进程在此期间接触它 用户可以执行完全独立的过程来 可能 写入 附加到同一数据文件 我希望这两个进程能够正
  • 在 Heroku 应用程序之间共享 Python 代码

    我有 2 个 Heroku 应用程序 都是 Pyhon 以及它们之间共享的一些 python 模块 即 它们在两个应用程序中是相同的 设置 git requirements txt 以实现以下目标的最佳方法是什么 共享代码是版本化的 也就是
  • 有没有办法在打字稿中实例化通用文字类型?

    我想做一些可能非正统的事情 如果我们诚实的话 几乎没有用 所以我们开始 我想传递一个文字作为通用参数 然后实例化它 考虑以下示例 const log console log class Root