Typescript 函数参数约束

以下两种方式传参,第一种方式正常运行,第二种会导致报错;出现这种现象的原因是什么?
`

interface IName {
  firstName: string;
  lastName: string;
}

function getFullName(name: IName): string {
  return `${name.firstName} ${name.lastName}`;
}

const params = {
  firstName: '宇智波',
  lastName: '斑',
  age: 100
}

// 写法1  正产运行
getFullName(params);

// 写法2 报错 
//类型“{ firstName: string; lastName: string; age: number; }”的参数不能赋给类型“IName”的参数。  
// 对象文字可以只指定已知属性,并且“age”不在类型“IName”中。
getFullName({
  firstName: '宇智波',
  lastName: '斑',
  age: 100
});

`

阅读 4.3k
2 个回答

后者属于额外的属性检查,在 TS 中设计如此(为什么这么设计你可以自行谷歌鸭式辨型法)。

当将对象字面量赋值给变量或作为参数传递时,如果对象字面量存在任何目标类型不包含的属性时,会抛出错误。

你可以使用类型断言:

getFullName({
  firstName: '宇智波',
  lastName: '斑',
  age: 100
} as IName);

用官方术语讲,这是 fresh object literal 的一个属性,TS 会对它是否有额外属性 (excess properties) 做检查。

这个设计的缘由其实很好懂:报错的第二个写法里,你是当场手写了一个字面对象作为参数传给了一个函数,那么意味着这个字面对象的构成对代码作者而言完全可控的,你可以随时加减、修改属性。既然是这样,明知 age 是多余的属性,你又何必多打这一行呢?所以 TS 对这种情况会报错。

更有用的例子是纠正错别字,比如你传参时误写成了 lastNaem,肉眼看这种情况是很容易漏掉的,那么这个额外属性检查的特性就可以及时提示错别字。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题