如何让TypeScript在传入函数的对象含未知属性时抛出错误?
如何让TypeScript对函数参数的额外属性报错
TypeScript 默认采用结构类型系统,只要传入的对象包含接口定义的所有属性,就会被认为符合类型,哪怕存在额外属性。但可以通过以下几种方式实现严格检查:
方法1:直接传入对象字面量
当你直接把对象字面量作为参数传入函数时,TypeScript 会自动触发额外属性检查,此时存在未定义属性就会报错:
interface ITest { id: number name: string } const testFunc = (data: ITest) => { console.log(data) } // 此处会直接报错:对象文字可以只指定已知属性,并且“test”不在类型“ITest”中 testFunc({id: 1, name: 'hello', test: ''})
方法2:使用精确类型约束(针对变量传递场景)
如果必须先把对象赋值给变量再传入,需要自定义精确类型工具来约束参数类型,确保没有额外属性:
interface ITest { id: number name: string } // 定义精确类型工具,确保T和U完全匹配 type Exact<T, U> = T extends U ? U extends T ? T : never : never; // 使用泛型约束参数必须是ITest的精确类型 const testFunc = <T extends Exact<ITest, T>>(data: T) => { console.log(data) } const test = {id: 1, name: 'hello', test: ''} // 此处会报错:类型"{ id: number; name: string; test: string; }"不满足约束"Exact<ITest, { id: number; name: string; test: string; }>" testFunc(test)
方法3:利用类型断言(不推荐)
可以通过as const或者直接断言为接口类型来限制,但这种方式不够严谨,属于手动强制类型:
const test = {id: 1, name: 'hello', test: ''} as ITest; // 虽然不会报错,但额外属性会被类型系统忽略,并非真正的检查 testFunc(test)
注意
TypeScript 没有全局配置项可以直接开启这种严格检查——因为结构类型系统的核心就是允许“鸭子类型”兼容,全局禁用会破坏很多常规用法。上述方法都是针对特定场景的局部解决方案。
内容的提问来源于stack exchange,提问作者user3284707
相关产品推荐
相关产品推荐

