使用类型作为参数 Typescript

2024-05-03

如何在 Typescript 中使用类型作为参数

type myType = {}
const passingType = (t: Type) => {
    const x : t = {}
}

passingType(myType);

我收到 TS 错误

“t”指的是一个值,但在这里被用作类型。您指的是 'typeof t' 吗?

and

'myType' 仅指类型,但在此处用作值。ts(2693)

用于通话

关于如何实现这一目标的任何想法。


这不可能。


TypeScript 的静态类型系统(其中包括您的myType定义和类型注释)是erased https://github.com/Microsoft/TypeScript/wiki/FAQ#what-is-type-erasure当代码作为 JavaScript 发出时。 JavaScript 是在运行时实际运行的。在运行时,您可以访问的所有内容是values。类型擦除意味着上面的代码变成这样:

const passingType = (t) => {
    const x = {};
};
passingType(myType);

没有指定值myType传递给passingType.

而且由于 TypeScript 类型在运行时不作为值存在,因此不存在像您所调用的那样的“类型的类型”Type。因此,如上所述,这种方法并不是直接可行的。


与其考虑在运行时将“类型”传递给函数(这没有什么成效),不如具体考虑一下您希望在纯 JavaScript 运行时发生什么,然后编写类型来支持它。

您真正想在运行时对“类型”做什么?您想用它来检查值是否属于该类型吗?然后,您可能不想传递类型,而是传递类型保护函数 https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards:

type Guard<T> = (x: any) => x is T;
const passingType = <T,>(t: Guard<T>) => {
    if (t(undefined)) {
        console.log("undefined IS of the guarded type T");
    }  else {
        console.log("undefined is NOT of the guarded type T");
    }
}

你可以这样使用它:

function isUndefined(x: any): x is undefined {
    return typeof x === "undefined";
}

passingType(isUndefined); // undefined IS of the guarded type T

function isNumber(x: any): x is number {
    return typeof x === "number";
}
passingType(isNumber); // undefined IS NOT of the guarded type T

function isNumberOrUndefined(x: any): x is number | undefined {
    return isNumber(x) || isUndefined(x);
}

passingType(isNumberOrUndefined); // undefined IS of the guarded type T

您的实际用例将推动参数的要求passingType应该看起来像。它可能是一个完整的数据结构,代表您想要在运行时使用“类型”执行的各种操作。因此,即使这个类型保护示例不适合您,也可能有其他东西可以。


但同样,简短的答案是 TypeScript 的静态类型系统被删除,因此不可能在运行时直接引用其类型。

Playground 代码链接 https://www.typescriptlang.org/play?#code/C4TwDgpgBA4grgQwE4BMA8AVAfFAvFACgA8AuKBAOxAEo8cioBLAZygwG4BYAKAGMB7Cs2BQwCZs0YUA5hnDR8mADRYCwMvGTpstXDgDePKMaYAzQsAJwKKCKakQU1Woe4n3UAUP4AbCADoffmkCACJrW3sKRygASQBlKH5zYAALaGlEVBjQSDZQ6i43EwBfYwgfZmhXDxMvZl8AoJDwmzsHFCZWADkAeQwklPSoTK0c+XzCo1KoHhKeHlNrXmBGQS6AVTaox2IyShoyBhYoCPbozpqTJAhgOCQKKFyIZKgGXA+oVsiO0KL57g8MQSKSyeQEFhbH4XQpQAD0cNO2w6cUSrzSGSytk6zzYC24SwoKzWjxY3TgAFsAEYQJB7chUahHLpQCiUmlIKBXYw3O4PJ7yV7vT6hNnU2l-OZA8SSGRySAQ5jk8VIWEIpHQmIJKB9Abo4ajbI4iYYfGE4nrMns2m9JBQ867UgMw5vFlijlQAA+Godl2mPNu91JSutdKItE93shyIuxCm3AB0pBcvBVpVtvtOyc7HhiLOWdRgyeBqx4zypsB3CAA

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

使用类型作为参数 Typescript 的相关文章

随机推荐

  • Android 设计导航抽屉 - 如何在 nav xml 中添加开关?

    我正在使用新的 Android 设计导航抽屉 我想在抽屉里加一个开关 有办法实现这个吗 这是菜单 xml menu menu
  • RecyclerView OnClick 位置

    我正在尝试获取我的点击项目的位置RecyclerView 然而 这有点奇怪 只让我在点击时记录位置 而不让我做一个Toast的位置 看这里 public class MainAdapter extends RecyclerView Adap
  • 如何将 Jinja 与 Twisted 一起使用?

    我正在计划使用 Python 与 Twisted Storm 和 Jinja 一起开发一个讨论软件 问题是 Jinja 不是为 Twisted 或异步套接字库而设计的 并且使用 Twisted 提供的性能是我不打算使用 Flask 的原因
  • 将 MyGeneration 与 Fluent NHibernate 结合使用

    我在这里找到了一个使用 MyGeneration 生成 NHibernate 代码的绝佳模板 http vucetica blogspot com 2009 01 nhibernate template for my Generation
  • 如何更改 GridView 内 ListViewItemPresenter 中的 SelectedBackground

    我在 SubSection 中有一个 Clickable Gridview
  • 如何重命名 Workbench 中的选项卡?

    当我创建新的查询选项卡时 它被命名为 SQL File 1 或类似名称 我想重命名它以更好地识别它们 是否可以 您可以使用命名查询选项卡来注册它们 File gt Save Script 我将发布我认为相关且易于实现的功能请求
  • HTML5:从存储的二进制字符串播放视频

    我正在尝试使用 FileReader readAsBinaryString Blob File 将视频文件的内容作为二进制字符串读取 如示例中所示http www html5rocks com en tutorials file dndfi
  • 更新写入 java 文本文件的对象

    将 Java 对象或列表写入文本文件是可以的 但我想知道如何更新或重写以前写入的对象而不再次写入对象 例如 假设有一个 java util List 有一组对象 然后将该列表写入文本文件 然后稍后该文件将被再次读取并从列表中获取所有对象 然
  • 如何在目标c中获取当前位置的纬度和经度

    我使用以下代码来获取当前位置 我添加了 corelocation 框架 void viewDidLoad super viewDidLoad locationManager CLLocationManager alloc init loca
  • ASP.NET 的电子邮件地址验证

    使用什么来验证 ASP NET 表单上的电子邮件地址 我想确保它不包含 XSS 漏洞 这是 ASP NET 1 1 ASP NET Web 表单上发布的任何脚本标记都会导致您的网站抛出未处理的异常 您可以使用 asp 正则表达式验证器来确认
  • 为 Keras 编写自定义数据生成器

    我将每个数据点存储在 npy 文件中 其中shape 1024 7 8 我想通过类似的方式将它们加载到 Keras 模型中ImageDataGenerator 所以我编写并尝试了不同的自定义生成器 但它们都不起作用 这是我改编的一个this
  • 正确别名向量

    我无法在其他地方找到答案 所以我想我只需要问这个 我正在尝试获取向量 其中存储 int 指针 的别名 如下所示 void conversion Engine ENGINES The Engine class has a vector of
  • 创建带小数秒的时间戳

    awk可以使用 strftime 函数生成时间戳 例如 awk BEGIN print strftime Y m d H M S 2019 03 26 08 50 42 但我需要一个带有小数秒的时间戳 最好是纳秒 gnu date可以用 N
  • 如何使用 swift 隐藏导航控制器中的后栏按钮

    在故事板 Xcode 6 iOS 8 和 swift 中 我在导航控制器中嵌入了 TableViewController 从对象库中 我拖放一个栏按钮项目作为后退按钮 它显示一个图标图像 当我单击该按钮时 我显示一个设置视图 我怎样才能隐藏
  • 集成共享同一个 MySQL 数据存储的 Django 和 Rails 应用程序的最佳方式是什么?

    我将在网络上与 Python 开发人员合作 应用 我将用 Ruby 构建其中的一部分 而他正在 将使用 Django 构建它的另一部分 我不太了解 姜戈 我集成这两部分的计划是简单地映射某个 URL Python 的路径前缀 例如 以 se
  • Android GLSurfaceView 具有可绘制背景

    我有一个带有可绘制对象作为背景的 GLSurfaceView 但是在没有 surfaceView setZOrderOnTop true 的情况下渲染时只有背景可见 我需要避免使用 setZOrderOnTop true 因为在 GLSur
  • 模型绑定到 MVC 中的列表

    我无法在服务器端检索简单的列表 有人能指出我正确的方向吗 public class TestList public string id get set public string name get set public string loc
  • 如何在 Xamarin.Forms 中强制使用浅色模式?

    我的应用程序的 UI 设计为在灯光模式下使用 但如果手机的默认主题是深色模式 我的应用程序也会切换到深色模式 并且 UI 看起来很垃圾 所以我想强制我的应用程序使用灯光模式 我怎样才能做到这一点 In my app xaml我使用的文件Us
  • __subclasses__ 没有显示任何内容

    我正在实现一个从适当的子类返回对象的函数 如果我搬家SubClass from base py 没有出现子类 subclasses 它们必须在同一个文件中吗 也许我从来没有直接导入subclass py对Python隐藏子类 我能做些什么
  • 使用类型作为参数 Typescript

    如何在 Typescript 中使用类型作为参数 type myType const passingType t Type gt const x t passingType myType 我收到 TS 错误 t 指的是一个值 但在这里被用作