获取泛型参数的类型

2024-02-07

我编写了一个小函数来更好地处理类型。

function evaluate(variable: any, type: string): any {
    switch (type)
    {
        case 'string': return String(variable);
        case 'number': return isNumber(variable) ? Number(variable) : -1;
        case 'boolean': {
            if (typeof variable === 'boolean')
                return variable;

            if (typeof variable === 'string')
                return (<string>variable).toLowerCase() === 'true';

            if (typeof variable === 'number')
                return variable !== 0;

            return false;
        }
        default: return null;
    }
}

function isNumber(n: any): boolean {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

我尝试对泛型进行相同的操作,但不知道如何从泛型参数获取类型。这是可能的?


你无法消除type字符串,但您可以通过添加重载使您的函数在类型方面更加智能和可用:

function evaluate(variable: any, type: 'string'): string;
function evaluate(variable: any, type: 'number'): number;
function evaluate(variable: any, type: 'boolean'): boolean;
function evaluate(variable: any, type: string): unknown {
    ...
    default: throw Error('unknown type');
}
const myBool = evaluate('TRUE', 'boolean'); // myBool: boolean
const myNumber = evaluate('91823', 'number'); // myBool: boolean
evaluate('91823', 'qwejrk' as any); // RUNTIME ERROR (violated types)

const mysteryType = 'number' as 'boolean' | 'number';
const myMystery = evaluate('91823', mysteryType); // COMPILER ERROR, no overload matches.

游乐场链接 https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABAUwG4EMA2J1WQCgwCcZ0AjTZALkXTAE8AaRKegB2sQHIBnKEsAHMuAShp8BggNwAoUJFgIUGbLgLFSFTnSYt2nLmBABbMsiKiaR0+dnzo8JGiw48hdCXKUaO5qw40XGRwcJR0lojBoch0duAOSs6qbhpe2gx++uL8MEJiiOAA1mBwAO5IAN4yiDWIPKUwUBAAFoj4-sgi1bVVtX2IEOg8yNwSucI0RMhQIERIAMo5Qu6eWiKy-bWDw9zWZhaT07NIMDwAcib7K5qUIogA-IgXNkTXaXc0ALQAjBubA0MRkEQmEwFwaL1-n0YMA2h04LDUlpEABeNGjJbCLpQqFTGZzRBIygAOigcAAMmVzABhQH4O5olHcfggZBcP44xB446IACEvKJyA5-QAvt1NgATZDAdAgTBQQ74pBGTCYYVisVyeKKE7nS7mfBgHwMfJRUGISE1bkE3mnM7oM74NgeYYAMUwcFwhpEdwAZL7EKdXblGgQwOsZJqIAg+IhjPQAEIg1HKFxqfBcAAqACUAKoAUS4zGB0XC60QAHoK3HEyCaGaYmAZNGwLH4899imkq4CFwAJzfAAcACYAMxF3b6izlqs1pOhesgxsybvp-tDscTrgAR1KyAAVkRClxaDxaCapJXq3mzpmAJIAWXziHz2ezAHls21UPBMGoJXoHA8F0zYxlANZ8OY9CZvoKaGFOJ5DNwDbhIgAA+k4vOyoGtuB8YPvQkFEPQXYqD2GYDiO47MPGRHQfoM7VtS74PgACne5Kvi+b6fswJSIHAqDmB66AAcYuAtMgPDEjIQA

请注意,不再存在空情况,因为不可能知道未知情况是否存在string类型实际上可能包含一个有效值,例如'number'在编译时。

这对于大多数人来说已经足够了。


然而...

上面请注意,mysteryType 联合不起作用。如果出于某种原因你真的真的希望它起作用,你可以使用条件类型:

function evaluate<T extends string>(variable: any, type: T):
    T extends 'string' ? string :
    T extends 'number' ? number :
    T extends 'boolean' ? boolean :
    never;
function evaluate(variable: any, type: string): unknown {
    ...
    default: throw Error('unknown type');
}
const mysteryType = 'number' as 'boolean' | 'number';
const myMystery = evaluate('91823', mysteryType); // myMystery: number | boolean

游乐场链接 https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABAUwG4EMA2J1WQHgBUUAPPMAEwGdEqoAnGMAcwD4AKDR9AI02QBcidGACeAGkRRRAB0GJCASgEAoROoWly1RAHI6jFrsQB+WgybNEqjZuRlklGrrAgAtj2T1jZ1x6-WahrE9trOPHBw-CI+iBFRyCKBtmBoXgDcKqCQsAgoGNi4yJzo3HzyIhJSsvIGlsqI4ADWYHAA7kgA3kHqVG0wUBAAFojs0nKKPYjdtrYQ6FTIenVGQvTIUCD0SADKFiwlZfyKmbMa84t6fp7eaxtbSDBUAHLuN4cwvMemiK-+9B8vshFNZEABaACMpzOiAuS108WiYF0QhmMNsMGAo3GyDgWK4n3KiAAvKTlvtmLpJuj0etNttEASgQA6KBwAAy7S8AGEFsUQaTiXoGCBkLpoTTEHSHogAISypnlCWzAC+U1sFGQwHQIEwUDu9KQrkwmGVarVWXA0Hgjxeby87DAQkqDURiS6U2lDNlT2e6Ge7BkpUWADFMHBcI7FCCAGQxxBPENMAbFMAnFQWiAIOiINyiABCkUwJPyWBweHYukIACUAKoAUV0kgRRfdVPSiAA9J3cwWi0I3SIVFmwDm838biW0GWipWAJwQgAcACYAMxNq727wnLs9vOFqID1tD6eFCu6Bcr9fNgCObWQACt6E1jAthGId93EHXnoQAJIALL1og9bVtWADy1ajKg8CYEUFDVHIVCTMO2ZQL2dBeKIhA1CWLhbq+4THsiiAAD6bv84qoaO6F5gBoiYfQohTgU5bFBeS5rhueaMdhNSfnuoj0bxQjXAE5GDmAKhAA


此外,如果您在谷歌上搜索了这个问题并且想知道如何获得T from MyClass<T>,这也是可能的:

class MyClass<T> {}

type GetMyClassT<C extends MyClass<any>> = C extends MyClass<infer T> ? T : unknown;
const myInstance = new MyClass<"hello">();
let x: GetMyClassT<typeof myInstance>; // x: "hello"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取泛型参数的类型 的相关文章

随机推荐

  • 如何触发 Hudson 的另一项工作作为预构建步骤?

    如何触发 Hudson 的另一项工作作为预构建步骤 有一个参数化触发器插件 https wiki jenkins ci org display JENKINS Parameterized Trigger Plugin 这会在 添加构建步骤
  • OpenGL 通过 FBO 渲染到纹理 -- 不正确的显示与正常纹理

    离屏渲染到纹理绑定的离屏帧缓冲区对象应该是微不足道的 但我遇到了一个问题 我无法理解 我的完整示例程序 目前仅限 2D 在这里 http pastebin com hSvXzhJT http pastebin com hSvXzhJT 请参
  • UICollectionView 用于 Xamarin.iOS 网格布局(MonoTouch)?

    我想知道是否有一个 UICollectionView 实现用于在网格中显示视图 图像 如下所示 我开始使用 UITableView 构建它 但是如果一个项目与其前任 后继项目不适合在同一行中 那么它会变得非常复杂 前几天我遇到了这个 这与你
  • Server单个端口(socket)最大并发连接数

    可以在同一端口 单套接字 上与服务器通信的并发客户端 使用不同端口号 的最大数量是多少 哪些因素可能影响这个计数 我正在 Linux 环境中寻找有关 telnet 的信息 这部分取决于您的操作系统 然而 对特定端口没有限制 然而 并发连接的
  • 多线程环境下什么是busy spin?

    什么是多线程环境下的 Busy Spin 它有什么用处以及如何在多线程环境中用java实现它 它以什么方式有助于提高应用程序的性能 其他一些答案忽略了忙碌等待的真正问题 除非您正在谈论一个您关心保存的应用程序电气功率 那么消耗 CPU 时间
  • 多重采样时如何解析 OpenGL 纹理中的深度值?

    我正在使用 FBO 将场景渲染为深度纹理 GL DEPTH COMPONENT 当我在应用程序中启用多重采样时 这些样本将解析为单个纹素 但它们是如何组合的 是存储到纹理的最近样本的深度 还是样本的平均值 此行为是否依赖于供应商 See t
  • 如何在 C# 中将字符串偏移量转换为时间跨度

    我正在尝试将转换时间转换为用户的时区 但我没有 Windows 时区字符串 例如 太平洋标准时间 我所拥有的只是一个字符串偏移量 例如 07 00 看来我需要创建一个时间跨度 是手动解析该字符串的唯一方法吗 似乎应该有一种方法使用字符串偏移
  • SQL GROUP BY:连续性间隔?

    这个想法是说你有下表 oID Area 1 5 2 2 3 3 5 3 6 4 7 5 如果可以按连续性分组 则此伪查询 SELECT SUM Area FROM sample table GROUP BY CONTINUITY oID 会
  • C# 二维int数组,对所有元素求和

    我尝试编写一个程序来对数组中的元素求和 但我有 系统索引超出范围异常 MVS 上的错误 有人能告诉我我的错误在哪里吗 public static int Sum int arr int total 0 for int i 0 i lt ar
  • 理解递归合并排序过程背后的直觉

    我对以下代码的以下输出感到困惑 def msort3 x print splitting x result if len x lt 2 print merging x return x mid int len x 2 y msort3 x
  • Visual Studio 2017 RC 安装错误“指定的帐户已存在。”

    当我尝试安装 Visual Studio 2017 RC 时 出现此错误 1764 001d 2016 11 20T10 14 21 Package Microsoft Ancm IISExpress Msi version 1 0 196
  • Numba JIT 比带有参数化函数的纯 Python 慢

    我刚刚写了一个简单的基准 https www matecdev com posts julia python numba cython html比较 Numba 和 Julia 并进行一些讨论 我想知道我的 Numba 代码是否可以以某种方
  • 如何以编程方式将项目添加到 arrayList 中的字符串数组?

    这是我的数组 xml文件在分辨率 值 folder
  • Jquery Draggable 具有多个句柄

    是否有可能有一个draggable具有多个句柄的元素 我初始化它两次 每次都使用不同的句柄参数 但它不起作用 只有第一个起作用 您应该只传递 handle 参数一次 它可以是选择器或元素 因此 要使其与多个句柄一起使用 elem dragg
  • 编写字体查看器 - 获取字体属性,动态加载 ttf

    我正在尝试使用 VB6 VB5 代码 在 Windows 下 为 TrueType OpenType 字体编写一个字体查看器 这是令人惊讶的困难 1 在VB winAPI中 我没有找到如何提取字体的名称或一般的字体属性 2 我可以安装字体
  • preg_match_all 和引号内的换行符

    另一个菜鸟正则表达式问题 问题 我可能做了一些愚蠢的事情 所以我想我应该利用 SO 常客的聪明才智 尝试匹配换行符 但前提是它们出现在双引号或单引号内 我还想捕获引号之间但不包含换行符的字符串 好的 这就是我得到的 有输出 下面是我想要得到
  • 在 Eclipse Maven 项目中找不到 persistence.xml

    我无法修复persistence xml file not foundeclipse问题 这是一个简单的测试项目 Maven Nature 用于非常基本的EJB测试 该文件确实在src main resources META INF 这是p
  • 应用程序开发人员犯的数据库开发错误[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么Java 8中没有BooleanConsumer?

    恐怕这是一个有点愚蠢的问题 有没有人可以告诉我为什么没有BooleanConsumer与相反BooleanSupplier https docs oracle com javase 8 docs api java util function
  • 获取泛型参数的类型

    我编写了一个小函数来更好地处理类型 function evaluate variable any type string any switch type case string return String variable case num