TypeScript返回非指定属性对象未报错问题咨询
TypeScript函数返回额外属性的类型检查差异问题
当返回的对象包含返回类型中不存在的属性时,TypeScript的错误触发行为会因函数定义方式不同产生差异,具体情况如下:
不触发错误的写法
使用函数类型直接定义函数时,返回包含额外属性的对象不会触发TypeScript错误:
type TResponse = Partial<{ name: string }> type TTemplate = (n: number) => TResponse; const getTemplate: TTemplate = (n) => { if (n > 5) { return { name: 'ddd' } } return { age: 18 } }
getTemplate的返回类型应为TResponse(仅含可选name属性的对象),但返回含age属性的对象时,TypeScript未报错。
会触发错误的两种情况
1. 返回对象先赋值给变量再返回
const getTemplate1: TTemplate = (n) => { if (n > 5) { return { name: 'ddd' } } const result = { age: 18 } return result; }
2. 直接在函数定义上指定参数和返回类型
const getTemplate2 = (n: number): TResponse => { if (n > 5) { return { name: 'ddd' } } return { age: 18 } }
差异原因
这是TypeScript两种不同类型检查规则导致的:
- 函数类型赋值的结构兼容性:当用函数类型(如
TTemplate)直接赋值变量时,TypeScript采用结构兼容性规则——只要返回对象是目标类型的超集(包含目标类型所有必要属性,这里TResponse是Partial,无强制属性),就认为兼容,不会检查额外属性。 - 对象字面量的新鲜度检查:当返回对象是直接写在
return语句中的字面量(如getTemplate2),或先赋值给变量(变量会被推断为包含额外属性的字面量类型)时,TypeScript会触发新鲜度检查,禁止对象字面量包含目标类型中未定义的属性,以此避免意外的属性泄漏。
内容的提问来源于stack exchange,提问作者Henok Tesfaye
相关产品推荐
相关产品推荐

