为什么any 会在不进行强制转换的情况下转换为更具体的类型

2024-05-03

在试图找出将 http 调用的 json 响应转换为 TypeScript 类/接口的最好方法时,我发现了这个代码片段堆栈溢出 https://stackoverflow.com/questions/37792534/http-type-assertion-from-json-object-to-typescript/37795362#37795362.

getTeachers(): Observable<Teacher> {
  return this.http.get('someUrl')
    .map((res: Response) => res.json())
}

看起来不错,但我不明白它是如何工作的。

  • 为什么没有转换语法来转换泛型any类型res.json()到更具体的类型Teacher?
  • 为什么推荐用于Teacher成为 TypeScriptinterface而不是 TypeScriptclass?

如果你看一下 Observable 的签名:

export declare class Observable<T> implements Subscribable<T> {...}

你可以看到它需要论证T. SomeThing<SomeType>被称为generic并引用TypeScript 手册 https://www.typescriptlang.org/docs/handbook/generics.html,如果你看看通用恒等函数:

  function identity(arg: any): any {
    return arg;
  }

使用时any当然是通用的,因为它会接受 arg 类型的任何和所有类型,但实际上我们正在丢失有关函数返回时该类型是什么的信息。如果我们传入一个数字,我们唯一拥有的信息就是any可以返回类型。

相反,我们需要一种捕获参数类型的方法,以便我们也可以使用它来表示返回的内容。在这里,我们将使用一个类型变量,一种特殊类型的变量,作用于类型而不是值。

  function identity<T>(arg: T): T {
    return arg;
  }

您可以定义getTeachers(): any {}如果您不关心此函数返回什么(或者您不知道)。它会起作用,但假设几个月后你要升级你的应用程序,你制作了一个漂亮的闪亮的新组件,它需要调用getTeachers()。它会返回什么?Any. Cool. =挖掘了几个月的旧代码=重复N次(;

但是既然你知道函数的作用(返回 http.method,这是一个 Observable),你可以写getTeachers(): Observable<any>{}。 ...闪亮的新组件;称呼getTeachers()。它会返回什么?可观察的。很好,我可以订阅它并获得Any。好的,我可以处理这个...

在大多数情况/示例中,这就足够了。但你可以更具体。 如果你知道什么this.http.get('someUrl')返回(假设它是响应正文中的 JSON 对象,标头“Content-Type”设置为“application/json” - 并且您使用 Respone.json() 来提取它),您可以编写getTeachers(): Observable<{}>{}。现在我们知道这是一个Object.

最后,如果您知道该对象将具有与接口相同的属性Teacher,你可以这样定义你的函数:

  getTeachers(): Observable<Teacher> {}

为什么没有转换语法将通用的任何类型的 res.json() 转换为更具体的类型 Teacher?

这里没有转换,数据保持不变。您只是通过声明数据为特定类型来提供该数据的“描述”。根据您所了解的信息。没有魔法(:.

为什么建议 Teacher 使用 TypeScript 接口而不是 TypeScript 类?

在此背景下Teacher可以是类或接口。在这里没关系,TypeScript 会从类或接口读取信息。如果您不会在任何其他上下文中使用 Teacher,则可以创建一个界面(它不会编译为 JavaScript,因此代码较少)。如果您在其他地方使用它,例如您需要一个实例Teacher:

  let new_guy = new Teacher();

那么你应该将 Teacher 声明为一个类。

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

为什么any 会在不进行强制转换的情况下转换为更具体的类型 的相关文章

随机推荐

  • 现实世界抽象类使用简单示例

    有没有使用抽象类的现实世界简单示例 我试图进入 PHP 的 OOP 但我仍然无法理解 为什么应该使用抽象类以及何时使用 是的 我知道不可能创建抽象类实例 只能创建继承它的类的实例 也许您有一个图像类 并且有 2 个驱动程序 GD 和 Ima
  • 为什么我能够使用无效的类指针进行函数调用

    在下面的代码片段中 虽然指针未初始化 但调用仍然成功 temp ptr ptr gt func2 是C 语言特性的问题 还是VC 6编译器的作弊 class temp public temp a 9 int func1 return a b
  • Spring Boot如何读取jar外部的属性文件

    在我的目标文件夹中 有 2 个文件夹 lib 和 conf 所有的属性文件都放在conf文件夹中 jar放在lib Folder中 在 Spring Boot 之前 我们在 spring xml 中使用以下配置来使用 value
  • 应用程序的外观 - Py2exe / wxPython

    所以我的问题是我的应用程序的外观和感觉 因为它看起来像一个旧的外观应用程序 它是一个 wxPython 应用程序 在 python 上它运行良好并且看起来不错 但是当我使用 py2exe 将其转换为 exe 时 外观很糟糕 现在我知道如果你
  • 如何在我的 Android 库 (AAR) 中包含 proguard 配置

    Android 库 根据AAR 文件规范 http tools android com tech docs new build system aar format 包含一个 proguard txt 文件 我的理解是 该文件声明了如何正确地
  • 在 Visual Studio 2010 中自动放置右花括号

    有没有一种方法可以在我在 Visual Studio 2010 中键入左大括号时自动放置右大括号 Netbeans 提供了类似的功能并且非常方便 The 生产力电动工具 http visualstudiogallery msdn micro
  • 如何在JdbcTemplate中执行多批量删除?

    我想一次删除多个数据库条目 仅当 3 个字段匹配 此处 姓名 电子邮件 年龄 时 才应删除每个条目 如果我只想删除单个属性 我会选择 String sql DELETE FROM persons WHERE email IN JdbcTem
  • 如何在经典 ASP 中将 Windows-1255 转换为 UTF-8?

    如何将 windows 1255 字符串转换为 utf 8classic应用服务提供商 我的数据库是 windows 1255 我想将我的网站转移到 utf 8 代码是否在这个答案 https stackoverflow com quest
  • css Flex div 随着子文本区域的增长而增长(无jquery)[重复]

    这个问题在这里已经有答案了 想象一下我有以下内容 div padding 20px div style display flex background gold div
  • Postgresql JDBC 驱动程序中的批量更新在自动提交中回滚

    我正在使用 postgres 9 3 1100 jdbc41 JDBC4 驱动程序进行批量插入 根据 JDBC 规范 其可达 到应用程序以禁用自动提交并提交或 回滚事务 就我而言 我没有使用任何事务 即自动提交为真 但如果批次中的其中一个插
  • Eclipse 中的 Android 框架源码级调试

    Android 框架的 Java 源代码可从 source android com 获取 我可以下载它们并将其提供给 Eclipse 以便在调试时进入框架方法吗 更好的是 有人知道 Eclipse 插件可以根据需要自动从 Android G
  • 测试计划/文档/管理工具

    我正在寻找一个好的 最好是免费的测试计划和文档工具 理想情况下 能够跟踪针对哪个软件版本运行了哪些测试 并具有报告能力 列出了一大堆工具here http www opensourcetesting org testmgt php但还有其他
  • 向数据集中选定的一组列名称添加后缀

    我想向数据集 CTDB 中的一组列添加后缀 例如 我有以下列 我想在末尾添加 Child 该子集是包含 100 多列的较大数据集的一部分 我不想重写每个列名称 9 SCARED BREATHE 10 SCARED HEADACHE SCHO
  • PHP 中使用 MVC 的 Post-Redirect-Get (PRG) 最佳实践

    PRG 模式与 MVC 是否有最佳实践 在本教程中 http www theserverside com news 1365146 Redirect After Post http www theserverside com news 13
  • Android 数组列表如何使用

    所以我有一个标记列表 我需要弄清楚如何处理它们 我已经搜索了几个小时 但没有明确说明如何使用这些信息或如何从列表中获取信息 请解释或分解我的代码并告诉我它到底是如何工作的 这样我就可以在地图上设置标记 这就是我将标记添加到列表中的方法 现在
  • 我如何将 C++ 与 VALA 混合起来

    我需要用 C 编写跨平台的 GUI 应用程序 但由于 C 的大多数 GUI 库都有点乏味 而且我对 C NET 非常熟悉 我发现使用 GTK 的代码 Vala 代码非常有趣 并且与其他方式相比有点容易 那么我该如何将 VAlA 与 C 混合
  • Windows 终端中的图标和背景图像字段无法识别父进程目录

    Windows 终端版本 1 12 10732 0 Windows 内部版本号 19043 1645 Issue 如果这个问题已经在其他地方得到解决 请原谅我 但我意识到当Use parent process directory被检查 Co
  • Perl:通过一次 MySQL 调用更新多行

    似乎这不可能 但嘿我不妨问一下 我可能是错的 想知道 perl 是否可以使用一个 MySQL 调用来更新多行 我正在使用 DBI 任何帮助或反馈将不胜感激 这可以通过 ASP 和 ASP net 在 MSSQL 中实现 所以想知道是否也可以
  • MongoDB 将字符串转换为数组

    我对 MongoDB 非常陌生 在将数据导入数据库时 遇到一些困难 现在我有一个文档集合 看起来像 db Question findOne id ObjectId 124 Answers 502 784 1060 答案现在存储为单个字符串
  • 为什么any 会在不进行强制转换的情况下转换为更具体的类型

    在试图找出将 http 调用的 json 响应转换为 TypeScript 类 接口的最好方法时 我发现了这个代码片段堆栈溢出 https stackoverflow com questions 37792534 http type ass