You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:05:26