Typescript,返回元组的通用可变参数工厂函数

2024-05-04

在打字稿中,可以像这样创建工厂函数,并定义返回类型:

function factory1<T>(object: new () => T): T {
  return new object();
}

如果我想创建几个不同的对象,我可以将此函数扩展为:

function factory2<T, U>(object1: new () => T, object2: new () => U): [T, U] {
  return [new object1(), new object2()];
}

现在我的问题是:这个工厂模式是否可以泛化为采用任意数量的不相关对象类型并仍然返回类型化元组?或者是放弃强类型并恢复使用任何类型的唯一选择?

像这样的东西:

function factory3<T extends any[]>(...objects: {new(): any}[]): [...T] {
  // BODY
}

最后一个,factory3,的问题是我们丢失了 T 的类型,而是得到了“typeof T”。例如:

    factory3(ClassA, ClassB, ClassC);

// actually becomes this:

    factory3<typeof ClassA, typeof ClassB, typeof ClassC>(...) : [typeof ClassA, typeof ClassB, typeof ClassC] {}

// But we want this to happen instead, which is possible for factory 1:

    factory3<typeof ClassA, typeof ClassB, typeof ClassC>(...) : [ClassA, ClassB, ClassC] {}


当然,您可以将工厂休息参数设为映射数组/元组类型 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-1.html#mapped-types-on-tuples-and-arrays。你需要一个类型断言 https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions或类似的东西来说服编译器主体中的返回值实际上是一个[...T]:

function factory<T extends any[]>(...ctors: { [K in keyof T]: new () => T[K] }) {
    return ctors.map(x => new x) as [...T];
}

您可以验证这是否有效:

class A {
    x = 1;
}
class B {
    u = "u";
}
class C {
    s = true;
}

const objects = factory(A, B, C);
// const objects: [A, B, C]
console.log(JSON.stringify(objects)); // [{"x":1},{"u":"u"},{"s":true}] 

Playground 代码链接 https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABMAhtOAnAngHgCqICmAHlIWACYDOiKYWA2gLoB8AFAHRfoZUBciAN6IGAaUQwkAa0JY4wRHiYCwhAO6I2ASkQBeForFNEAXx2CAUImuIMhKCAxIeVDgFsUABzbE9B1RrEOig0DFwcSgDcFiYWFhAANiE0AIJCVja+uogAjNGxicmIAELpNoggeogARCDVkYgx8UlUNADCZTY02VAYIIT5cRAIVFCIcABGAFaE0N3IaFCYWGwpADQlG21a0QD0u4jDYKPj07NQ-CLrm4htTPEjcAmEHAlwAOZsAFIAygDyADkOKMMJJ3jBgCtJjM5lodoh9iJBNViNU+DkTGtkXU+LVqpjkVQ0b1+iZjBYgA

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

Typescript,返回元组的通用可变参数工厂函数 的相关文章

  • 我可以从 HTTP 请求中找到无线接入点的 BSSID(MAC 地址)吗?

    假设有人在咖啡店里无线连接到互联网 并向 johnsveryownserver com 发送 HTTP 请求 服务器端 有什么方法可以确定我的MAC地址吗 无线接入点他们连接到什么 请注意 我对他们机器的 MAC 地址不感兴趣 如果我无法使
  • Java HashMap 嵌套泛型与通配符

    我正在尝试创建包含自定义类的不同子类的哈希集的哈希映射值的哈希映射 如下所示 HashMap
  • 计算Javascript中两次点击之间的时间

    我想用 javascript 计算属性的两次点击之间的时间 但我不知道如何 例如 a href click here a 如果用户单击多次 假设 5 秒内 我想显示警报 如果有帮助的话我正在使用 jQuery 我对 javascript 不
  • 在浏览器中语音聊天? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在寻求建立一个小组 voice 使用服务器上的node js 在浏览器中聊天 这可能吗 如果您希望您的解决方案是基于服务器端和客
  • 在 BIRT 中输入参数后更新数据集查询

    在 BIRT 报告设计中传递参数后 如何更改或更新数据集的查询 详细说明 我有一个如下所示的查询 WHERE 该参数标记可以保存不同的值 在用户输入参数后 它看起来像这样 例如 WHERE column name 1 or WHERE co
  • 将 jquery-mobile 与 Webpack 结合使用

    我正在尝试使用 webpack 加载 jquery mobile 但到目前为止还没有运气 我知道 jquery mobile 依赖于 jquery ui 而 jquery ui 又依赖于 jquery 如何在 Webpack 中设置这样的场
  • 禁用 JavaScript 中的右键单击

    当我尝试禁用右键单击时 它不起作用 我尝试使用下面的代码 document onclick function e console log e button if e button 2 e preventDefault return fals
  • 响应式网格布局框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用模态表单 ajax 超出 HTMLFormElement.toString 的最大调用堆栈大小

    我想使用模态窗口中的 ajax 请求提交表单 单击此链接可打开该模式 a class btn btn primary i class fa fa edit i Write a review a 模态窗口 div class modal fa
  • ElectronJS ReferenceError:导航器未定义

    我正在尝试在电子上制作自定义标题栏 但是当我启动我的应用程序时 我遇到了 ReferenceError 导航器未定义 问题 请帮忙 这是我的 main js 中的代码片段 My Codes https i stack imgur com c
  • v-file-input .click() 不是函数

    我试图以编程方式触发 v file input 的 click 事件 因为它在 Vuetify 的文档中 但它显示一个错误this refs imagePicker click is not a function我在这里错过了什么吗 代码重
  • 用数组反向查找对象

    假设我有一个这样的对象 resourceMap a 0 1 2 3 4 5 6 7 8 9 10 b 11 12 c 21 23 d 54 55 56 57 510 确定是否的最佳方法是什么resourceId 21将会 c 我们不知道钥匙
  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • jQuery 选择器:为什么 $("#id").find("p") 比 $("#id p") 更快

    该页面的作者 http 24ways org 2011 your jquery now with less suck http 24ways org 2011 your jquery now with less suck断言 jQuery
  • 选中复选框时提交表单

    有没有办法在选中复选框时提交表单
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 如何获取使用 .map 渲染的第一个元素的 ref?

    我需要在几行中显示视频 卡片 的缩略图 并重点关注第一个缩略图 我使用嵌套地图进行了显示 该代码基本上迭代视频数组并返回多行视频 我们如何关注第一个渲染的元素 我认为我们需要获得第一个要聚焦的元素的引用 但是我们如何在这里设置 ref 并在
  • React Native - 跨屏幕传递数据

    我遇到了一些麻烦react native应用程序 我不知道如何跨屏幕传递数据 我意识到还有其他类似的问题在 SO 上得到了回答 但是这些解决方案对我来说不起作用 我正在使用StackNavigator 这是我的设置App js file e
  • Express.js Passport认证自动失败跳过策略

    UPDATE 我已将代码从护照本地注册内部移至单独的处理程序 并且运行良好 问题在于 Passport 和本地注册的使用 但我不知道为什么 我使用 Node js Express Passport 进行身份验证和注册设置 这是以前使用过的标

随机推荐

  • 使用 MapBox GL JS 无需访问令牌

    有没有办法使用MapBox GL JS没有访问令牌 我在文档中找不到任何提示MapBox GL JS https docs mapbox com mapbox gl js api 然而 Uber建议是可以通过他们的图书馆 https ube
  • 如何设置 MPEG-4 文件的“媒体创建”日期

    我有许多从各种数码相机格式转码的 MPEG 4 文件 其文件系统修改日期是正确的 我想设置 媒体创建 标签来匹配 这可以通过 属性 窗口的 详细信息 选项卡在 Windows 资源管理器中手动完成 设置 媒体创建 非常有用 因为 Windo
  • 强制 WcfSvcHost.exe 使用我的自定义服务主机

    是否可以强制 WcfSvcHost 当我执行 F5 或在解决方案中调试另一个项目时自动执行 使用自定义 ustom 服务 通过使用服务工厂 我的自定义服务主机在我的 asp net 主机容器中运行良好 该服务工厂又调用自定义服务库 但是当
  • 使用 ExecuteSqlCommand 调用存储过程(需要未提供的参数)

    我正在尝试使用 EF 调用存储过程context Database ExecuteSqlCommand因为我的参数之一是数据表 以下是该过程的参数 ALTER PROCEDURE mySchema myProc customerId INT
  • 由于 MSVCR110.dll,MS Visual Studio 2012 Ultimate 无法启动

    当我尝试运行 MVS 2012 时 我总是收到错误 在库 DLL MSVCR110 dll 中找不到过程 crtCreateSymbolicLinkW 的入口点 我已经从我的另一台计算机复制了这个 dll 文件 一切正常 但没有帮助0 o
  • 实现自己的“工厂”以重用 WPF 中的视图

    我目前正在使用WAF WPF 应用程序框架 http waf codeplex com discussions 361216用于 WPF 编程 我真的很喜欢为我的应用程序中的每个小视图单元拥有一个自己的 ViewModel 的想法 我随后以
  • 内置方法读取couchdb文件大小?

    我正在尝试使用 couchdb 作为消息存储 并想报告消息大小 理想情况下 读取 size 属性会很好 最坏的情况是我可以检查整个文档 JSON 的字符串长度 我什至可能想使用尺寸作为查看键 您认为记录文档大小的最佳方法是什么 为什么您认为
  • 使用 varargin (...) 时如何显示不同的函数用法?

    当您输入 Matlab 函数名称并打开大括号时 例如sum 在命令窗口中 将打开一个工具提示 显示此函数的所有可能用法 当我编写自己的接受函数时varargin 工具提示仅显示一个选项 而不是varargin puts e g myfunc
  • 如何将 OpenCV 等待键与 Chaquopy 一起使用

    我正在尝试使用 Chaquopy 将计算机视觉应用程序移植到 Android 当我尝试运行脚本时 以下行中出现以下错误 cv2 waitKey 100 打印到嵌入式 python 控制台的错误是 java chaquopy CQPEnv c
  • 带有 API 21 的 Snackbar

    我正在尝试在我的应用程序中实现新的 Snackbars 但我做不到 首先 我从以下位置下载了 zip 文件这个 SnackBarSampleActivity https github com nispok snackbar blob mas
  • 如何测试包含应用程序是否授予“允许完全访问”权限?

    我正在开发一个键盘扩展项目 在应用程序代码的某些点 我需要测试用户是否已授予键盘扩展的 允许完全访问 权限 协议是我需要从应用程序端进行这些测试 并在此基础上让用户访问键盘设置或在未授予权限的情况下提醒他 问题是这里提供的方法如下 func
  • pexpect 和 ssh:如何在 su - root -c 之后格式化一串命令

    我正在尝试迭代服务器和密码列表来更改一组服务器上的 sshd 配置 以便我可以使用无密码 SSH 密钥通过 root 登录 运行命令 我可以在 bash 中轻松完成此操作 但我正在尝试学习 Python 并且 显然 希望放弃手动输入密码 这
  • 如何保证auto_increment数字没有间隙?

    我有一个关于自动递增的问题 这是我的表 我首先拥有它 它可以顺利地递增 id id name 1 name1 2 name2 3 name3 4 name4 5 name5 6 name6 但是当我删除一条记录并插入一条新记录时 id从7开
  • bash while 循环线程

    我有一个 while 循环读取来自 a 的行 hosts while read line do ip line check done lt hosts 我的问题是我可以使用某种方法来加快速度 或者一次在 10 个主机上运行检查 每个检查都在
  • Firebase BigQuery 导出 - 历史数据

    当我尝试在 BigQuery 上搜索事件的历史数据时 我只能找到上周的事件 我无法在任何地方找到信息是否正确 或者我做错了什么 基本上我似乎只能查询过去一周的 events YYYYMMDD 它是否正确 您是否有机会在一周前从 Fireba
  • 如何找到 Rails 中的当前路线?

    我需要知道 Rails 中过滤器中的当前路线 我怎样才能知道它是什么 我正在处理 REST 资源 但没有看到命名路由 如果您尝试对视图中的某些内容进行特殊处理 您可以使用current page as in 或者一个动作和ID 或命名路线
  • 使用 PHP 将图像中的一种颜色替换为另一种颜色

    有人可以帮我编写一个简单的脚本 使用 PHP 将图像中的特定颜色替换为另一种颜色吗 这是一个示例 颜色从绿色变为黄色 如果你的意思是在 PHP 中使用 GD 库 你应该检查一下图像过滤器 http php net manual en fun
  • Chart.JS 工具提示回调标签和标题 (v3.5)

    请注意 v2 有很多答案 这是 v3 的 我正在尝试设置工具提示label and title对于圆环图 Code Create the donut chart donut new Chart questions positivity do
  • 为一列中的多行生成不同的随机数

    我得到了一列带有整数值 n 行 的列 我想生成满足特定条件的值的正态分布范围内的随机数 我尝试使用下面的代码 但它们太慢了 df members bd df members bd apply lambda x np random norma
  • Typescript,返回元组的通用可变参数工厂函数

    在打字稿中 可以像这样创建工厂函数 并定义返回类型 function factory1