TypeScript接口嵌套属性为何未触发必填校验?
问题原因分析
这是因为你用了as Person这种类型断言,TypeScript对类型断言的检查逻辑和普通类型注解完全不同:
- 当你忘记写
PersonWrapper时,对象的顶层结构和Person接口完全不匹配(接口要求必须有PersonWrapper属性),编译器能直接识别这种明显的结构缺失,所以触发报错。 - 当你写了
PersonWrapper但缺了name时,as Person相当于你强制告诉编译器“这个对象就是Person类型”,编译器会信任你的断言,不会深入检查嵌套对象的所有必填属性,只会做最基础的顶层结构匹配,所以不会报错。
解决办法
如果想要严格检查所有必填属性,别用类型断言,改用类型注解:
// 用类型注解会强制检查所有层级的必填属性 const payload: Person = { PersonWrapper: { name: '张三', // 缺这个会直接报错 address: '123 memory lane' } };
如果必须用断言(比如处理后端返回的不确定结构),可以先定义一个严格的类型守卫函数来验证对象结构,再进行断言,避免遗漏必填属性。
内容的提问来源于stack exchange,提问作者fumeng
相关产品推荐
相关产品推荐

