获取泛型参数的类型

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(使用前将#替换为@)

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

  • 使用 Object.entries() 时保留键类型

    这是我的问题的一个例子 ts 游乐场演示 https www typescriptlang org play code C4TwDgpgBAKg1hEUC8UDkAzA9ltUA 6ARgIYBOehaAJhBiQK4A2wA0omgFCc
  • Node.js 10 的 TypeScript tsconfig 设置?

    有谁知道 Node js v10 x 需要哪些目标 库才能在没有生成器的情况下使用内置的 async await 我看到很多关于节点 8 的信息 但没有看到关于节点 10 的信息 从 Node js 开始10 0 0 100 支持ES201
  • 为什么此代码会失败并显示 sourceCompatibility=1.8 [重复]

    这个问题在这里已经有答案了 以下代码在使用 sourceCompatibility 1 7 或 1 6 编译时有效 但在切换到 1 8 后失败 public class Java8Wat interface Parcelable stati
  • 打字稿 - 找不到导出

    我在模块 A 中有这个 Typescript 文件 somefile tsx import remAuto from tidee life theme 在模块 B 中 我导出了 index js 文件remAuto index js imp
  • 运行时的泛型[重复]

    这个问题在这里已经有答案了 有两个程序 为什么第一个代码有效 我希望它在访问元素时抛出运行时异常 因为添加了字符串而不是整数 相似地 第二个代码在访问元素时抛出运行时异常 尽管它能够轻松地在 arrayList 中添加 Integer 尽管
  • 为什么不允许接口作为注释成员?

    考虑这段代码 Retention RetentionPolicy RUNTIME Target ElementType METHOD public interface Bar Foo foo default FooImpl FooConst
  • 如何使用 TypeScript API 将 tsconfig.json 编译为配置对象?

    我正在寻找一个公共官方 TypeScript API 最好是 4 x 版本 用于解析tsconfig json jsconfig json文件到完整的 TypeScript 配置对象 我所说的 完整 是指 它的所有属性都填充有值 要么显式地
  • 在从命令行运行的 NestJS 脚本中使用服务

    我知道如何从命令行运行脚本 使用npm or npx ts node script ts 正如所述here https stackoverflow com questions 60704316 run nestjs script from
  • 如何使用泛型而不是注释来实现构建器类?

    我想写一个通用的建造者阶级它包装任何 java 类并提供特定样式的 setter 函数 我不确定这是否可以称为 动态生成的函数 当我有一个豆子般的 Pojo 课时 即 class Pojo public void setValue int
  • 限制类型安全异构容器中的键

    我想使用 Joshua Bloch 的 Effective Java 中描述的泛型类型安全容器模式 但想通过使用枚举来限制可用作键的类 以下是约书亚书中的代码 public class Favorites private Map
  • 为什么 IsAssignableFrom() 不适用于 int 和 double?

    这是错误的 typeof double IsAssignableFrom typeof int 这是错误的 typeof int IsAssignableFrom typeof double 但这有效 double a 1 0 int b
  • 单击上一页的按钮路由到该页面后如何刷新页面

    我有 2 个页面 一个主页和一个页面 2 当我单击主页上的按钮时 它会路由到 page2 现在 单击主页上的按钮后 当我到达第 2 页时 它应该刷新 因为我的项目中存在一些缓存问题 我在ngoninit上添加了window location
  • 为什么不自动装箱泛型的 Java 基本类型?

    Java 不允许在通用数据结构中使用原始类型 例如 不允许使用 ArrayList 原因是 原始类型不能直接转换为Object 然而 Java 1 5 确实支持自动装箱 并且包装类在通用数据结构中工作 那么为什么编译器不能将其自动装箱到 A
  • Angular 8 Native Typescript 无崩溃,访问器简写

    角8 我曾经在打字稿方面用作简短的黑客 object accessor accessor accessor to get object accessor accessor accessor 如果其中一个子级为空 则不会冒抛出错误的风险 根据
  • 渲染作为 Prop 传入的 Component

    我怎样才能渲染一个StyledComponent它是作为道具传入的吗 我正在传递一个Spinner组件到我的BarComponent作为渲染的道具 我尝试使用 this props icon in my BarComponent在下面的示例
  • 警告:找不到父级 tsconfig.json

    我想修复警告 警告 找不到父级 tsconfig json 在打字稿中Errors tab in IntelliJ IDEA 2016 3 我的 TypeScript 代码位于src目录和我的 TypeScript 输出将是lib正如预期的
  • 将 Backbone 结构转换为 TypeScript

    看看 Backbonejs 的实现扩展功能 http backbonejs org docs backbone html section 186 它表明它不是一个基本的原型扩展 当主干扩展直接转换为 TypeScript 类时 有些东西会停
  • 从回调中访问状态

    我在从回调访问组件状态时遇到问题 国家的价值num更改正确 但此类更改对于加载时定义的回调函数不可见 import React useState from react class MyObject callback gt void cons
  • 通过扩展和实现的组合来理解 TS 的类型推断/缩小

    我有以下示例代码 class B implements Error name string message string stack undefined string function Foo x any if x instanceof E
  • 使用打字稿的 Angular 6 的黄金布局?

    我在用黄金布局 https golden layout com 与 Angular 6 一起 如下本教程 https npm taobao org package embedded enterprises ng6 golden layout

随机推荐

  • 如何触发 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