当泛型类型设置为 never 时,泛型条件类型解析为 never

2023-11-22

我需要一个泛型类型,当(该属性的)泛型参数为时,该类型可以从指定类型中排除泛型属性never。为了实现这一点,我使用了Omit和条件类型。例如,当通用参数设置为number它的行为符合预期,但是当泛型类型设置为never,类型解析为never而不是排除指定的属性 (操场):

type BaseType<T> = {
  prop1: string;
  genProp1: T;
};

type Excluded<T> = T extends never ? Omit<BaseType<T>, "genProp1"> : BaseType<T>;

const obj1: Excluded<number> = {
  genProp1: 5,
  prop1: "something, something"
};

//obj2 is never
const obj2: Excluded<never> = {
  prop1: "dark side" //error: Type 'string' is not assignable to type 'never'
};

为什么要这样做以及如何让它返回正确的类型({ prop1: string })?

EDIT:相比于null代替never解决了这个问题。我仍然想知道我使用时发生了什么never.


条件类型分布在裸类型参数上。这意味着条件类型将应用于联合的每个成员。never被视为空联盟。因此,条件类型永远不会被应用(因为联合中没有成员可以应用它),从而导致never type.

简单的解决方案是使用元组禁用条件类型的分配行为:

type BaseType<T> = {
    prop1: string;
    genProp1: T;
};

type Excluded<T> =
    [T] extends [never] ? Omit<BaseType<T>, "genProp1"> : BaseType<T>;

const obj1: Excluded<number> = {
    genProp1: 5,
    prop1: "bla"
};

const obj2: Excluded<never> = {
    prop1: "dwdadw"
};

游乐场链接

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

当泛型类型设置为 never 时,泛型条件类型解析为 never 的相关文章

随机推荐

  • 如何在 Node.JS 中限制(或排队)对外部进程的调用?

    Scenario 我有一个 Node JS 服务 使用编写ExpressJS 通过 DnD 接受图像上传 example 上传图像后 我对其执行一些操作 从中提取 EXIF 数据 调整大小 这些电话正在通过节点 imagemagick目前的
  • Chrome DevTools 扩展:如何从内容脚本中的元素面板中获取选定的元素?

    我已经完成了我的研究并为此苦苦挣扎了一段时间 但我需要你的帮助 我正在构建一个 Chrome DevTools 扩展 它应该传递 元素 面板中当前选定的元素作为参考到内容脚本中定义的 JS 对象 重要的是我要通过参考到选定的元素 或者从内容
  • 获取 64 位整数中的位位置数组

    好吧 这可能听起来有点复杂 但这就是我想要做的 以10101010101 并返回 0 2 4 6 8 10 包含所有已设置位的位置的数组 这是我的代码 UINT DQBitboard firstBit U64 bitboard static
  • jQuery:在模糊()事件之前触发单击()

    我有一个输入字段 我尝试在其中提出自动完成建议 代码看起来像
  • 如何在 Chrome 的弹出窗口上切换设备模式?

    我有一个网络应用程序 其中的聊天功能会在新的弹出窗口中打开 通常 在 Chrome 中我可以按 F12 并单击智能手机的图标来切换它 但在弹出的窗口中并没有出现该图标 这对我来说很重要 因为我需要限制弹出窗口的连接以模拟用户从聊天中断开连接
  • 如何在 GCC 中指定枚举大小?

    我想为枚举指定 64 位的枚举大小 这怎么可能通过 GCC 实现呢 该代码不需要 可移植 因为我只对使代码在 x86 32 和 x86 64 Linux 的 GCC 编译上工作感兴趣 这意味着任何可以提供我想要的功能的黑客都可以 只要它适用
  • 处理urllib2的超时? - Python

    我在 urllib2 的 urlopen 中使用超时参数 urllib2 urlopen http www example org timeout 1 我如何告诉Python 如果超时到期 应该引发自定义错误 有任何想法吗 您想要使用的情况
  • 为什么我的区域特定 Web API 可以从所有其他区域访问?

    我目前正在开发一个 ASP NET MVC 4 Web 应用程序项目 该项目必须遵守以下设计决策 主 MVC 应用程序位于解决方案的根目录中 所有管理员功能都位于单独的区域中 每个外部方 例如供应商 都有自己的区域 每个区域 包括根部 都构
  • 什么是 ruby​​ on Rails?

    我是一名前端开发人员 HTML CSS JS 和 jQuery 我了解一点 PHP 我正在尝试了解 Ruby Ruby on Rails 是什么 On http rubyonrails org 它说 Ruby on Rails 是一个开源
  • C++11 字符串开头的大小写不敏感比较(unicode)

    我必须检查特定字符串是否以另一个字符串开头 字符串使用 utf8 编码 比较应不区分大小写 我知道这与那个主题非常相似C 中不区分大小写的字符串比较但我不想使用 boost 库 我更喜欢便携式解决方案 如果 几乎 不可能 我更喜欢面向 Li
  • Angularjs 获取巨大 json 文件的请求

    我需要向用户显示数据库中的一些数据 数据位于 json 文件中 并且大小相当大 json 文件的大小大约在 15MB 左右 我创建了一个服务并使用 Promise api 发出成功的请求并加载数据并通过在 div 上执行 ng repeat
  • SFINAE 与以下 has_member 函数一起无法正常工作是什么?

    我正在尝试以下示例沃尔特 布朗 Walter Brown 的 TMP 演讲我正在努力得到他的has member实施工作 然而 实现似乎错误地返回 true 这让我相信 SFINAE 有一些我不理解的细节 include
  • 在 MATLAB 中使用 imshow 方法显示图像标题

    如何在 MATLAB 图形中显示图像标题 我有以下代码 I imread images pap png subplot 1 2 1 imshow I here I want to show labels Use the title命令 它的
  • 用于开发新的Windows Azure管理门户的框架?

    有谁知道微软使用什么框架在Windows Azure上开发类似Metro的Web管理门户 如果是这样 开发者可以使用吗 I 提出了同样的问题并因此受到很多仇恨 获胜的答案是地铁用户界面包 它完成了 Azure 中的许多工作 但您必须自己实现
  • 如何在 java 中使 JTable 可编辑

    我在 java 中使用 JTable 但它不允许我编辑单元格 private final TableModel dataModel new AbstractTableModel public int getColumnCount retur
  • proxyMode ScopedProxyMode.TARGET_CLASS 与 ScopedProxyMode.INTERFACE

    正如其他 SO 答案所建议的 根据您的需要使用代理模式类型 我仍然很困惑 Configuration ComponentScan public class Application public static void main String
  • Python:更新线程中的参数

    我想知道当该参数在程序主体中获得新值时是否可以启动一个新线程并更新其参数 所以像这样 i 0 def foo i print i time sleep 5 thread start new thread foo i while True i
  • SQL 选择 MAX(COUNT)

    我正在尝试选择具有 MAX 微帖子数的用户 SELECT name count FROM users INNER JOIN microposts ON microposts user id users id GROUP BY users i
  • IntegrityError:错误:列“user_id”中的空值违反了非空约束

    使用 postgres PostgreSQL 9 4 5 我刚刚迁移了一个sqlite3数据库到一个postgresqlD b 由于某种原因 自从这次迁移以来 当我尝试创建用户时 出现了有关user id 这是主键 正在被提升 以前这不是问
  • 当泛型类型设置为 never 时,泛型条件类型解析为 never

    我需要一个泛型类型 当 该属性的 泛型参数为时 该类型可以从指定类型中排除泛型属性never 为了实现这一点 我使用了Omit和条件类型 例如 当通用参数设置为number它的行为符合预期 但是当泛型类型设置为never 类型解析为neve