javascript - 当对象类型不匹配时,泛型函数没有编译错误
问题描述
考虑以下什么都不做的通用函数:
const typed = <T>(fields: T) => {}
然后我们定义以下类型和变量:
type Simple = { a: string };
const fields = { a: "", b: "" };
以下运行正常
typed<Simple>(fields);
但这会导致编译错误:
typed<Simple>({ a: "", b: "" });
在这两种情况下,输入类型都是相同的,但第二个示例失败(应该如此)。为什么第一个案例有效?
打字稿版本:3.5.3
解决方案
当您object literals
作为参数传递时,它们会进行过多的属性检查 - https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks。
对象文字在将它们分配给其他变量或将它们作为参数传递时会得到特殊处理并进行过多的属性检查。如果一个对象字面量有任何“目标类型”没有的属性,你会得到一个错误:
只有已知的属性才能通过对象字面量传递。simple
类型只有属性,a
但是对象文字有附加b
属性a
。
解决方案 -
typed<Simple>({ a: "", b: "" } as Simple);
推荐阅读
- google-apps-script - 如何在 Google Sheets Scripts 中获取工作表的最后一行(不是数据的最后一行)?
- lazarus - 我需要帮助解决 Lazarus FPC Blowfish 库使用问题
- python - 为什么没有出现“游戏结束”文字?
- python - 按聚合对范围内的缺失值进行分组
- memory - spaCy PhraseMatcher 内存不足/使用 100% CPU
- python - 如何在最优控制中限制 SoC?
- python - Django 模型,如何创建看起来像 json 的模型
- javascript - 如何通过单击javascript按钮来增加价值
- c# - 如何从一个文件夹下载 pptx 文件到客户端系统 - MVC
- reactjs - 我收到此错误错误:找不到模块'../list/songQueue.jpg',使用json-server我正在传递我的图像文件的路径