如何在不存储 TypeScript 的情况下进行内联类型检查?

2024-04-23

我有一些界面

ITestInterface {
  foo: string;
}

我想将此接口的实例作为参数传递给函数。该函数将采用任何对象类型,因此它本身不会进行类型检查。为了确保对象的类型正确,我可以使用存储:

const passMe: ITestInterface = { foo: "bar" };
someFunction(passMe);

但我希望有一种方法来内联创建参数,同时仍然进行类型检查。

// made up example syntax
someFunction({ foo: "bar" } istype ITestInterface);

有没有像上面的内联示例这样的好方法?

我尝试过使用 as,但它不限制类型。例如,以下内容是有效的。

someFunction({ foo: "bar", hello: true } as ITestInterface);

在这种情况下我可以做的另一件事是修改someFunction有模板,但这不是我认为很好的解决方案。我不会永远拥有这个特权。

someFunction<TYPE>(arg: TYPE) {
  // modify function definition
}

someFunction<ITestInterface>({foo: "bar"});

您正在寻找的特定功能(例如“任意表达式的类型注释”)在 TypeScript 中不存在。有一个开放的建议 https://github.com/microsoft/TypeScript/issues/7481因为它目前标记为“需要提案”,因此您可能需要给它一个????,或者描述您的想法(如果它们令人信服并且与现有内容不同)。但在我看来,似乎没有人在做这件事,所以如果我是你,我就不会屏住呼吸。


这里有多种方法,每种方法都有自己的问题。

正如您所看到的,最简单的方法是使用类型断言 https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions。这可以防止您传入完全不相关 type:

// assertion
someFunction({ foo: "bar" } as ITestInterface); // okay as expected
someFunction({ unrelatedThing: 1 } as ITestInterface); // error as expected

它还允许额外的属性(这仍然是声音和类型安全的,类型的对象ITestInterface不能保证not拥有其他属性......这可能会让您感到惊讶,因为您期望超额财产检查 https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks,但这些只会有时发生):

someFunction({ foo: "bar", hello: true } as ITestInterface); // okay by design,
// excess properties are allowed

但这里最重要的问题是类型断言让您不安全地缩小类型,因此以下不会是错误:

someFunction({} as ITestInterface); // no error ?! assertions also NARROW types

另一种方法是创建一个名为的辅助函数isType像这样:

// helper function
const isType = <T>(x: T) => x;

这几乎完全符合您的要求:

someFunction(isType<ITestInterface>({ foo: "bar" })); // okay as expected
someFunction(isType<ITestInterface>({ unrelatedThing: 1 })); // error as expected

someFunction(isType<ITestInterface>({ foo: "bar", hello: true })); // error as you want
someFunction(isType<ITestInterface>({})); // error as everyone wants

但是,正如您所说,这对您来说可能不值得。大多数运行时引擎都会乐意内联函数,例如x => x所以我不认为这是一个表现问题。但这可能是一个优雅问题,这取决于你。


无论如何,这些是我能做的最好的了。希望有帮助。祝你好运!

链接到代码 https://www.typescriptlang.org/play/#code/JYOwLgpgTgZghgYwgAgJIBUIGcyvNeJZAbwChlkYB7KgLmRylAHMBuUgX1JgFcQEwwKiAZUAthABifAUJAAKAB70+AaxBUA7iACUJLqQTCcyAA5wsWALIR6GbLnyxEKALwlKNegCIARnChvZA52LHEpGUFheXNLGx12UgB6JOQLLGgokFIwiWl+LPliTzpkPwCgjjSsNEwcPEhnJATkFOQqVTgAT2rkCEVTCAEIABMc8PzZaOK+KAgAGzhIEfQACxZ6AEZg3vt6p0IIFrboKCooXv7B4bHxvMi5IpKff0CAGmRVhfnSsCgeFBVCy1BwNAguY6pDrdZC+HojbDAZggN7JVL9JCWMxnQZQQTYNJzNLzH6aUakO4RAqPYhAmp7RyNQ6Q5AaPpQM4XAD8AEJqhk8XIanB5mFkAA5ACCACVpQB5ADqyDAXUGWApaM+C1xlAewkMxjAyGAWHQqrcyAAPOgAHxKejoPSuG3IRSJXJUqYKE1mwaWhlgpoQO3FailcqBYI6FnQnrAq5DZaUyaFH3m-11RngpAh5CzBZLUZrDbIbYcaOsVrojnnS4DRPk5N672m9MBg4uXNhl4VD5fEm-f6AitV9mc3pdKg8ZCaODgJvU6Jpv3tpmdorllmnWvxgBu0EnIBQs-A6qAA

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

如何在不存储 TypeScript 的情况下进行内联类型检查? 的相关文章

随机推荐

  • 这是在 Django 中进行依赖注入的正确方法吗?

    我正在尝试将依赖项注入到我的 Django 视图 控制器 中 这是一些背景知识 通常情况下 urls py文件是处理路由的 通常是这样的 urlpatterns path views get all posts name get all p
  • ngx-translate 在延迟加载模块中不显示任何文本

    我们在应用程序中使用 Angular 6 我们最近开始为我们的应用程序准备延迟加载 应用程序有多个延迟加载的路由 我们希望对所有路由使用单一语言文件 不需要将其分成块 但在引导程序上加载所有翻译 我尝试的第一件事就是在 AppModule
  • 使用 C# 进行 ECDHE 密钥交换

    我正在尝试使用 net 通过 TLS 1 2 进行 ECDHE 密钥交换 服务器正在响应 server key exchange 消息 该消息以 04 开头 所以我猜它是未加密的 根据我的理解 消息的前 32 位被视为值 X 接下来的 32
  • 分形加密

    我听说可以使用 Mandlebrot 集的图来加密数据 并且这种加密算法是量子安全的 与许多常用算法不同 不能用量子计算机破解 我在 Google 上查找更多信息 但只找到了一些针对非技术受众的文章 有谁有任何这方面的资源 我可以用它来了解
  • Scapy 不需要的 RST TCP 数据包

    为了理解TCP是如何工作的 我尝试伪造自己的TCP SYN SYN ACK ACK 基于教程 http www thice nl creating ack get packets with scapy http www thice nl c
  • 在 OSGi 参考注释中动态设置目标属性

    读完一篇article https thecarlhall wordpress com 2010 06 06 set osgi service reference target through configuration on 参考目标 h
  • 通过 Django All-auth 上的 AJAX post 请求登录

    根据 django all auth 的文档 它支持通过AJAX请求登录 当我向 accounts login 发出正常的post请求时 响应头的内容类型是 text html 但是当我进行 ajax 调用时 它是 application
  • 有没有办法为 GridPane 中的元素添加动画效果

    我正在尝试为元素添加动画GridPane 我有课Unit这代表了我想要移动的东西 public class Unit private Text text private Rectangle rectangle private StackPa
  • 将 php4/mysql4 迁移到 php5/mysql5:预期的 php 问题?

    我有一个遗留的Web应用程序php4 mysql4 MyISAM 数据库包含一些cms 一些用户数据 一些日历应用程序 现在我要迁移到带有 php5 mysql5 的新服务器 在这种迁移场景中 典型的 php 问题是什么 php sql 查
  • 是否可以在两个 Android 设备之间直接将数据传输给同一网络中的其他用户?

    假设我有两个 Android 移动设备 连接到同一个无线网络 并且该网络没有外部 互联网访问权限 在没有第三方软件的情况下 是否可以在不知道对方ip 不创建热点的情况下通过wifi传输数据 就像我们在 Windows 上所做的那样 如果 2
  • 生产准备 Ionic 应用程序的任务

    我想弄清楚是什么best从代码传递到最终可部署 apk ipa 的过程 到目前为止 我有一个使用 Karma Jasmine 的测试套件 它将 TypeScript 转换为 JS 并运行一些单元测试 我通过 gulp 开始这个过程 之后我所
  • PhantomJs - 如何渲染多页 PDF

    我可以使用 phantomJS 创建一页 PDF 但我在文档中找不到如何创建不同的页面 每个页面都来自 html 视图 并将它们放入一个 PDF 中 我正在为 NodeJS 使用 node phantom 模块 只需要指定一个paperSi
  • 多线程应用程序断点

    如果我对多线程应用程序设置断点 会发生什么情况 它是否停止所有线程 仅停止断点的线程 还是整个程序崩溃 如果可能的话 我是否只想停止一个线程 或者这会弄乱我的应用程序 如果我无法对多线程应用程序进行断点 我可以使用哪些调试技术 JAVA 就
  • 动态创建临时表,插入临时表,然后select

    基本上我希望能够根据现有表动态创建临时表 然后将值插入到临时表中 然后选择插入的值 我已经得到了可以创建临时表的部分 工作得很好 只是插入和选择表单的效果不太好 这是我当前的代码 declare table table OrdinalPos
  • iOS Javascript Workers终止()后CPU占用率过高

    我有一个复杂的 JavaScript 函数 可能需要 1 秒或很多分钟才能发送答案 所以我创建了一个正在工作的 Worker 我从 Swift 中的 UIWebView 调用这个函数 stringByEvaluatingJavaScript
  • 如何将项目添加到布局中的特定索引

    我按照这个示例创建一个流布局 http doc qt io qt 4 8 qt layouts flowlayout example html http doc qt io qt 4 8 qt layouts flowlayout exam
  • 如何在滚动时实现图像淡入效果(如 mashable.com)

    我想知道 mashable com 上图像的淡入效果 请参阅http mashable com 2009 08 14 google android logo remixes http mashable com 2009 08 14 goog
  • Ember:断言失败:EmberObject.create 不再支持定义计算属性

    我使用的是 Ember 2 16 版本 我们升级到了 3 8 版本升级后 我看到此错误 但无法弄清楚错误来自何处 在什么情况下我会收到此错误 我看到其中一篇帖子 Ember JS 中的动态计算属性已弃用 https stackoverflo
  • 使用 php 和 mysql 将多个复选框值存储到数据库

    我想将多个复选框值存储在单个字段中 我使用该链接http www mindfiresolutions com Storing array data to MySQL using PHP 1296 php http www mindfires
  • 如何在不存储 TypeScript 的情况下进行内联类型检查?

    我有一些界面 ITestInterface foo string 我想将此接口的实例作为参数传递给函数 该函数将采用任何对象类型 因此它本身不会进行类型检查 为了确保对象的类型正确 我可以使用存储 const passMe ITestInt