如何制作一个类的泛型是必需的?

2023-11-21

班级是:

class Test<P> {
  constructor(data: P) {}
}

我希望以下代码不会通过类型检查,因为它没有传入泛型:

new Test({ a: 1 })

我知道上面的通用 P 会自动导出为{a: number},但这不是我想要的,下面是。

new Test< {a: number} >({ a: 1 })

我尝试了很多方法,但最终泛型P会自动派生为构造函数的参数类型。


有一个问题涉及非常相似的问题here:

async function get<U = void>(url: string & (U extends void ? "You must provide a type parameter" : string)): Promise<U> {
    return null as any;
}

不同之处在于,在这种情况下,参数中根本不使用类型参数。这意味着打字稿没有地方可以从中推断出类型参数。如果在您的情况下,类型参数在参数列表中使用,则打字稿将使用该参数作为源来推断类型参数,并且我们使用默认值作为未显式指定类型参数的信号的技巧将不会工作(因为打字稿如果可以推断类型参数,则不使用默认值)。

解决方案很简单,让 typescript 知道我们不希望它推断T从一个特定的参数。虽然没有内置支持来执行此操作,但 jcalz 提供了合理的解决方法here

type NoInfer<T> = [T][T extends any ? 0 : never];
class Test<P = void> {
  constructor(data: NoInfer<P> & (P extends void ? "No type parameter was supplied" : {})) {}
}

new Test({ a: " "}) // err Argument of type '{ a: string; }' is not assignable to parameter of type 'void & "No type parameter was supplied"'.
new Test<{ a: string }>({ a: " "})// ok

play

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

如何制作一个类的泛型是必需的? 的相关文章

随机推荐

  • 如何解码类型取决于标签的值数组?

    我有一个包含值数组的 JSON tag Foo tag Bar tag Baz 我想将这个数组解码为一个数组struct其中特定类型取决于标签 protocol SomeCommonType struct Foo Decodable Som
  • SearchView 的 OnCloseListener 不起作用

    我正在尝试添加对SearchView在 Android 3 0 ActionBar 中 但我无法获取OnCloseListener上班 这是我的代码 Override public boolean onCreateOptionsMenu M
  • 如何允许通过应用程序脚本访问 importrange 函数?

    When you enter an importrange function manually into a spreadsheet you receive a pop up and must allow access 但是 我正在尝试找到
  • cout 消息的顺序与预期不符

    当我执行下面的代码时 我对它的输出感到困惑 Code int add int a int b cout lt lt inside int add function lt
  • 如何防止 Angular 指令之间共享作用域?

    我的所有指令都使用相同的范围 并且我希望我的指令能够自行运行 指示 app directive headerSort function return restrict A controller function scope element
  • 如何从 WordPress 数据库获取缩略图到外部页面

    我有一个 WordPress 安装 我想做的是直接从数据库中的 WordPress 表调用数据并将它们显示在其他一些非 WordPress 页面上 目前 我已成功从 中提取了最近的三篇帖子wp posts桌子 然而 我无法在架构中看到存储帖
  • Tensorflow/Keras 中 Dice Loss 的正确实现

    我一直在尝试尝试基于区域 骰子损失但互联网上有很多不同程度的变化 我找不到两个相同的实现 问题是所有这些都会产生不同的结果 以下是我找到的实现 一些用途smoothing因素本文作者已经打电话了epsilon 有些在分子和分母中都使用它 使
  • 致命:./config 中“core.sharedrepository”的配置值错误

    我刚刚输入命令 git config core sharedrepository 1我现在收到错误 致命 config 中 core sharedrepository 的配置值错误 有谁知道如何解决它 当您为 git config core
  • JavaScript 中的“=>”(由等于和大于组成的箭头)是什么意思?

    我知道 gt 运算符意味着大于或等于 但我见过 gt 在一些源代码中 那个运算符是什么意思 这是代码 promiseTargetFile fpParams aSkipPrompt relatedURI then aDialogAccepte
  • 如何从任务中打印累加器变量(似乎无需调用 value 方法即可“工作”)?

    我知道从任务的角度来看 当累加器变量在工作节点中执行时 它们是 只写 的 我对此做了一些测试 我意识到我能够在任务中打印累加器值 这里我正在初始化驱动程序中的累加器 scala gt val accum sc accumulator 123
  • 如何让动态导入在 webpack 4 中工作

    我正在尝试将我的应用程序迁移到 webpack 4 我的头已经疼了 动态导入 这是我的代码分割方法 逐页 但我无法让它发挥作用 使用以下软件包设置了非常简单的测试器 devDependencies babel core 6 26 3 bab
  • 子串算法

    任何人都可以指出在另一个字符串中搜索子字符串的最佳算法吗 或者在另一个字符数组中搜索一个字符数组 从什么角度看最好 高德莫里斯普拉特是一个很好的 您可以在以下位置找到更多讨论内容 字符串搜索算法的维基百科条目
  • 如何从已签名的 .Net 程序集中读取数字签名信息?

    我正在编写一个要在我们的软件构建过程中使用的程序集信息应用程序 并尝试从已签名的 Net 程序集中读取数字签名信息 我想在我的 C 代码中执行 Windows 资源管理器可以执行的操作 方法是右键单击已签名的程序集并选择 数字签名 选项卡
  • 整数类型上基于 iLocation 的布尔索引不可用

    我有一个问题 我想获取那些包含缺失值的行 使用 iloc 和pd isnull 对于我表中的 里程 列 import pandas as pd df pd read csv BikeList csv d1 df Mileage print
  • 格式化十进制 C# - 保留最后一个零

    我一直在寻找这个但似乎找不到答案 我有以下小数以及我想要从 String Format 获得的相应输出 100 00 gt 100100 50 gt 100 50100 51 gt 100 51 我的问题是我似乎找不到一种格式可以保留 10
  • Scala - 当外部进程退出时获取回调

    我想用 scala 替换我的很多 Perl 我经常做的一件事是调用公司其他团队提供给我的二进制文件 通常是编译的 C 但也可以是 java 其他 perl 脚本 q 脚本等 例如 为了进行一些复杂的数学运算 我将启动一个外部二进制文件 然后
  • 如何将 AngularJS 与 Struts 1.x 结合使用

    我对 AngularJS 和客户端内容很陌生 我正在向使用 Struts 1 3 作为框架的旧应用程序添加一个新页面 我想使用 AngularJS 作为前端 我知道如何通过将 JSON 写入前端并返回来从操作类返回 JSONnull为前进的
  • 我可以将一种编译生成的目标文件链接到另一种编译生成的目标文件吗?

    更具体地说 我们假设两个编译器位于同一平台 操作系统 指令集 上 然而 其中一个目标文件是由依赖于编译器的代码生成的 另一方面 代码是面向对象的并且尊重封装 我需要这个来构建我正在制作的框架 目标平台是任何有GCC和Java虚拟机的系统 事
  • 在Linux中查找哪个驱动器对应哪个USB大容量存储设备

    我有几个 USB 大容量存储闪存驱动器连接到 Ubuntu Linux 计算机 Ubuntu 10 04 1 内核 2 6 32 25 386 我需要以编程方式区分它们 如果可能的话 从 bash 但我不怕编译 我需要找到哪个块设备对应于哪
  • 如何制作一个类的泛型是必需的?

    班级是 class Test p constructor data P 我希望以下代码不会通过类型检查 因为它没有传入泛型 new Test a 1 我知道上面的通用 P 会自动导出为 a number 但这不是我想要的 下面是 new T