首页 > 解决方案 > 当对象类型不匹配时,泛型函数没有编译错误

问题描述

考虑以下什么都不做的通用函数:

const typed = <T>(fields: T) => {}

然后我们定义以下类型和变量:

type Simple = { a: string };

const fields = { a: "", b: "" };

以下运行正常

typed<Simple>(fields);

但这会导致编译错误:

typed<Simple>({ a: "", b: "" });

在这两种情况下,输入类型都是相同的,但第二个示例失败(应该如此)。为什么第一个案例有效?

打字稿版本:3.5.3

Playground link: https://www.typescriptlang.org/play/#code/MYewdgzgLgBFCeAHApgExgXhgHgCoD4AKAMwEtkAbVCALhlwEpN8YBvAXwFgAoHhFGAGVSAW0QVkmNjACGdaACdSYAOYx2Abh6hIsMpWpTWsugCJTAGhgAjM6fVbe3APTO4AC1IQYoMaQkQfEho2MJiEkT6VBAMjjyuHl4+MgCuEMjevoj+MlCk4DDICgogCkEoqKGi4shExnIw5la2jfbssTxAA

标签: javascripttypescriptcompilationtypescript-generics

解决方案


当您object literals作为参数传递时,它们会进行过多的属性检查 - https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks

对象文字在将它们分配给其他变量或将它们作为参数传递时会得到特殊处理并进行过多的属性检查。如果一个对象字面量有任何“目标类型”没有的属性,你会得到一个错误:

只有已知的属性才能通过对象字面量传递。simple类型只有属性,a但是对象文字有附加b属性a

解决方案 -

typed<Simple>({ a: "", b: "" } as Simple);


推荐阅读