typescript - 为泛型设置 OR 条件
问题描述
考虑类型
type Smth<T, U> = ...
现在我想检查T
is string
ORU
是否是原始的。
我可以单独检查条件
type AreSame<T, U, Y, N> = (<X>() => X extends T ? 1 : 2) extends (<X>() => X extends U ? 1 : 2) ? Y : N
type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N
type IfPrimitive<T, Y, N> = T extends string | number | boolean | symbol | bigint | null | undefined ? IfAny<T, N, Y> : N
type Smth1<T, U> = AreSame<T, string, true, false>
type Smth2<T, U> = IfPrimitive<U, true, false>
但是如何通过 加入他们or
?
解决方案
只需将第二个条件放入第一个的虚假分支:
type AreSame<T, U, Y, N> = (<X>() => X extends T ? 1 : 2) extends (<X>() => X extends U ? 1 : 2) ? Y : N
type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N
type IfPrimitive<T, Y, N> = T extends string | number | boolean | symbol | bigint | null | undefined ? IfAny<T, N, Y> : N
type Smth<T, U> = AreSame<T, string, true, IfPrimitive<U, true, false>>
推荐阅读
- python - 什么是 c++ 版本的 tensorrt.volume?
- reactjs - 使用特异性级别为 1 的 styled-components 定位子元素
- laravel - ADLDAP openLDAP 身份验证 - 未存储会话 - 返回登录页面
- firebase - 请帮助我 CloudFirestorePlugin.java 使用或覆盖已弃用的 API。(未经检查或不安全的操作。)
- java - 包含特定元素的列表
- mysql - 如何在没有 WHERE 的情况下计算连接表上的行数
- windows - 屏幕(虚拟)键盘在 Win10 中如何工作
- perl - Sendmail 使用 localhost.localdomain
- python - Python:需要文件的Popen-ing命令,用字符串替换文件?
- php - Vim 命令在 laravel 上创建数据库