使用 Typescript 检查接口类型

2024-05-23

这个问题是直接类比使用 TypeScript 检查类类型 https://stackoverflow.com/questions/12789231/class-type-check-with-typescript

我需要在运行时查明任何类型的变量是否实现接口。这是我的代码:

interface A{
    member:string;
}

var a:any={member:"foobar"};

if(a instanceof A) alert(a.member);

如果您在打字稿游乐场中输入此代码,最后一行将被标记为错误,“名称 A 在当前范围内不存在”。但事实并非如此,该名称确实存在于当前范围内。我什至可以将变量声明更改为var a:A={member:"foobar"};没有编辑的抱怨。在浏览网页并找到有关 SO 的另一个问题后,我将接口更改为类,但随后我无法使用对象文字来创建实例。

我想知道 A 类型怎么会像这样消失,但是看看生成的 javascript 就可以解释这个问题:

var a = {
    member: "foobar"
};
if(a instanceof A) {
    alert(a.member);
}

A 没有作为接口的表示,因此不可能进行运行时类型检查。

我知道javascript作为一种动态语言没有接口的概念。有没有办法对接口进行类型检查?

Typescript Playground 的自动完成功能揭示了 TypeScript 甚至提供了一种方法implements。我该如何使用它?


您无需instanceof关键字,您现在可以编写自定义类型保护:

interface A {
    member: string;
}

function instanceOfA(object: any): object is A {
    return 'member' in object;
}

var a: any = {member: "foobar"};

if (instanceOfA(a)) {
    alert(a.member);
}

会员众多

如果您需要检查大量成员以确定对象是否与您的类型匹配,您可以添加一个鉴别器。下面是最基本的示例,要求您管理自己的鉴别器......您需要更深入地了解模式以确保避免重复的鉴别器。

interface A {
    discriminator: 'I-AM-A';
    member: string;
}

function instanceOfA(object: any): object is A {
    return object.discriminator === 'I-AM-A';
}

var a: any = {discriminator: 'I-AM-A', member: "foobar"};

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

使用 Typescript 检查接口类型 的相关文章

  • JavaScript 中的“new”关键字是什么?

    The newJavaScript 中的关键字第一次遇到时可能会很混乱 因为人们倾向于认为 JavaScript 不是面向对象的编程语言 它是什么 它解决什么问题 什么时候合适 什么时候不合适 它做了 5 件事 它创建一个新对象 这个对象的
  • 有没有办法监控页面上运行的 JavaScript 函数?

    有没有办法查看页面上正在执行哪些功能 如果我在页面上加载外部脚本 是否可以动态更改函数的功能或阻止其运行 HTML5 http www w3 org TR html5 scripting 1 html establish script bl
  • 缓存 firestore 中 get 的第一个实现

    我希望 firestore 每次都先从缓存中获取数据 根据 Firestore 文档 传递 缓存 或 服务器 选项必须启用相同的功能 下面的例子 db collection cities where capital true get cac
  • 通过 jquery/javascript 在警报或确认对话框中单击“确定”?

    我正在考虑在backbone js 和jquery 中编写一些UI 测试 它们可能不是最好的方法 但这是我正在考虑的事情 通过纯代码自动化测试而无需记录和回放 使用这种方法唯一让我摸不着头脑的是 在某些 用例流程 执行的 中 会出现确认 警
  • 夜间值班。单击带有文本的元素

    我遇到问题 无法单击具有某些独特文本的网页元素 我有这样的结构 div class wg wagon type title Text div 我试试这个 click wg wagon type title contains Text 但我有
  • 如何为 HTML5 音频元素制作加载栏?

    我正在尝试为 HTML5 音频元素制作一个加载栏 显示加载 缓冲的百分比 对于视频标签 可以使用以下方法进行计算 video buffered end 0 video duration 但我无法让它与音频标签一起使用 它只是返回一个固定值
  • 卸载/销毁 Angular 延迟加载组件

    我的设置与此处找到的帖子类似http ify io lazy loading in angularjs http ify io lazy loading in angularjs 处理 Angular 中我的应用程序的各种组件的延迟加载 我
  • 光滑的旋转木马不工作

    我一直在尝试简单地实现 Slick Carousel 的工作 我已按照 Git 页面上的说明进行操作 https github com kenwheeler slick https github com kenwheeler slick 这
  • 在 IE10 中禁用捏合放大

    在 IE10 触摸模式下 我希望仅使页面的特定部分可缩放 其余的不应该 我找到了这个 http msdn microsoft com en US library ie hh772044 aspx http msdn microsoft co
  • 离子旋转器未显示

    我用 http 请求填充 Ionic 集合重复列表 但我不想将所有内容直接加载到 DOM 中 因此 我只显示其中一些项目 并在您向下滚动时添加其余项目 为此我实现了无限滚动功能 当我到达页面底部时 它应该显示一个旋转器 但它没有 这些物品至
  • 更新 Google 地图流量层而无需重新加载页面

    我的页面中嵌入了 Google 地图 我使用 initMap js 函数来初始化地图 function initMap var map new google maps Map document getElementById t map zo
  • 如何检查元素的内容是否为空,如果是,则在 jquery 中删除该元素

    我目前正在尝试选择某个 div 内没有内容的任何 h2 元素并将其删除 这是我的 html 代码 div class skipToContainer h2 class vidSkipTo Hello h2 h2 class vidSkipT
  • 在 HTML5 中将两个图像合并到一个画布上

    我正在使用 HTML5 canvas 元素 假设我有 2 个 ImageData 对象 我想将它们组合起来放在一张画布上 假设我不关心这些图像如何组合 两个 ImageData 对象具有完全相同的像素数和形状 组合两个图像的最佳方式是什么
  • 在 jQuery AJAX 成功中从 MySql 获取特定响应

    好吧 我有这个 ajax 代码 它将在 Success 块中返回 MySql 的结果 ajax type POST url index php success function data alert data My Query sql SE
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • 如何生成 JavaScript 堆栈跟踪? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 关于如何以跨浏览器的方式在 javascript 中生成堆栈跟踪有什么建议吗 较新的浏览器 Chrome 和 Firefox 公开了一个允
  • 显示班级图片 10 秒

    我有下面给出的代码显示9 boxes 其值如下digital time 还有一个班级box002显示digits相当于随机选择的九个盒子的值 box002 can be dragged to digital time starting wi
  • 父指令属性更改时子指令不会更新

    这是对这两个问题的后续 在父指令和子指令之间传递参数 https stackoverflow com questions 42814530 pass argument between parent and child directives
  • 跨浏览器:禁用输入字段的不同行为(文本可以/不能复制)

    我有一个被禁用的输入 html 字段 在某些浏览器 Chrome Edge Internet Explorer 和 Opera 中可以选择并复制文本 但至少在 Firefox 中这是不可能的 您可以通过在不同浏览器中执行以下代码来测试
  • openssl_pkey_get_details($res) 不返回公共指数

    我在用着这个例子 https stackoverflow com a 12575951 2016196使用 php 生成的密钥进行 javascript 加密openssl图书馆 但是 details openssl pkey get de

随机推荐

  • Espresso-android jar - android studio 8.x 中“打开 zip 文件时出错”

    我一直收到此错误 我已经尝试了此处所述的解决方案 Android studio 无法完成 gradle 执行 打开 zip 文件时出错 https stackoverflow com questions 23828085 android s
  • 为什么应该或不应该将数据集、数据表等存储为 ASP.NET 页面中的会话变量?

    我正在开发一个使用 Web 服务返回的数据集的 Web 应用程序 当应用程序运行时 我将该数据集存储为会话变量 以便在用户导航到将编辑数据集中的表的不同页面时反复使用 这个想法是 当应用程序加载时 用户只需要等待一次数据 然后应用程序将使用
  • Visual Studio 2010 Intellisense 抛出错误

    我编写 2D 游戏引擎已经大约两年了 最近智能感知一直抛出错误 代码编译 链接和运行都很好 但智能感知会报告多达 70 个 错误 我尝试删除测试项目和库生成器项目的 SQL 文件 但在重建智能感知数据库时 只有一个构建的错误停止了 尽管它不
  • 指针数组与元素数组

    今天早上我和一位同事就这个话题进行了讨论 他说 将数组分配为指针数组总是更好 因为单独分配每个元素更有机会获得空闲内存块 有点像这样 Consider n elements as a dynamic value int n elements
  • 使用 Pandas 读取 CSV 时如何删除 .0

    我有一个 CSV 文件正在读入 pandas 数据帧 所有数字都没有任何小数位 但是当我将其读入 dframe 时 它 会在带小数的数字中添加尾随零 1205 变为 1205 0 如何在 pd read csv 期间去掉 0 我知道我可以在
  • JFreeChart - 具有 2 个图例的颜色问题

    我尝试在图表中创建自定义图例 但当我显示一两个图例时 会发生一些奇怪的情况 当我显示 2 个图例 旧的和新的 时 一切都很好 图例和图表中的颜色受到尊重 但是 当我只想显示新图例时 图例中的颜色受到尊重 但图表中的颜色不再受到尊重 这是我的
  • context.xml 的 glassfish 替代品是什么

    我习惯于配置网络应用程序context xml 包括jdbc资源和应用程序配置参数 在 glassfish 下 什么被认为是存储应用程序配置信息的标准位置 我们曾经将它存储在context xml文件如下
  • sizeToFit 运行异常

    我有一段代码 每次发生后端数据库更改时都会执行 本质上我在父视图中有一个标签 标签由许多状态消息之一更新 每个状态消息位于不同的行上 并以换行符 n 结尾 每条状态消息只能在一行上 并且不能过多 我遇到的问题是 当视图首次重新加载时 一切正
  • Visual Studio 2010 支持 iPhone 开发吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何使用 Windows 开发机为 iPhone 进行开发 https stackoverflow com questions 22358 how can i develop for iphone u
  • 闪亮的传单添加大量分离的折线

    我有一个 200k 行数据集 其中包含出发地和目的地的坐标 我有一个 R 闪亮的应用程序 带有传单地图 可以在这些坐标上显示圆圈 尽管坐标数量很大 但效果很好 这是数据的简化示例 每行包含出行id 出发地经纬度 目的地经纬度 id lat
  • android设计库gradle空指针异常

    我正在尝试添加android support design我的项目的库 我的 gradle 文件中所有有趣的事情 dependencies compile fileTree include jar dir libs compile com
  • Tomcat从Eclipse和startup.sh启动

    奇怪的事情发生了 我可以从 Eclipse 和startup sh 启动Tomcat 从 Eclipse 运行我可以访问 localhost 8080 而从startup sh 运行时我不能 可能是什么问题呢 Ubuntu 11 10 在
  • iOS 中系统日期更改后如何更改带有日期的标签?

    我有一个简单的查询 但不知道该怎么做 这就是我想要实现的目标 1 我有一个带有今天日期的 UILabel 即 29 04 12 2 在午夜 我希望该标签自行更新为 30 04 12 而无需更改视图或按任何内容 这是第2步 我不知道该怎么做
  • 如何使用 private_key.pepk 签署 Android 应用程序

    我在 Google Play 中有一个应用程序 现在我需要发布该应用程序的新版本 2 如何使用 private key pepk 签署 Android 应用程序 我丢失了 Java 密钥库 jks 或 keystore 我只有 privat
  • CodeMirror:如何限制编辑器中的高度

    I am using codemirror http codemirror net to show some code on a webpage But when I initialize the codemirror editor the
  • 在Java中赋值?

    假设我设置了 int A int B 当我更改 A 之后 它不会更改 B 的值 但是当我设置 SomeClass A SomeClass B 并且更改 A 的内容 如 a cost 时 它会更改 B 成本也是如此 谁可以给我解释一下这个 我
  • 将跟踪消息获取到来自控制器的失败请求跟踪中

    在 ASP NET MVC Preview 5 上 我们无法从全局或控制器获取任何跟踪消息以显示在页面 视图 或失败请求跟踪 FREB 中 这些调用都不能在控制器操作中工作 HttpContext Trace Write hello Sys
  • 如果 RCurl::getURL() 执行时间太长,如何停止执行?

    有没有办法告诉 R 或 RCurl 包在超过指定时间段时放弃尝试下载网页并转到下一行代码 例如 gt library RCurl gt u http photos prnewswire com prnh 20110713 NY34814 b
  • 用于匹配某些数字的正则表达式

    以下正则表达式将匹配 9 11 位数字 d 9 11 编写完全匹配 9 的正则表达式的最佳方法是什么or11位数字 不包括10位 使用输入元素的模式属性 因此正则表达式应该匹配输入字段的整个值 我想接受任何包含 9 或 11 位数字的号码
  • 使用 Typescript 检查接口类型

    这个问题是直接类比使用 TypeScript 检查类类型 https stackoverflow com questions 12789231 class type check with typescript 我需要在运行时查明任何类型的变