typescript 关于接口的语法检查问题

请教一下是为什么 同样是用MyInterface的接口校验规则 去检测为什么第一个能正常编译 后者报错
其中的编译规则是怎样的

interface MyInterface{
  name: string
}

function consoleName(myObj: MyInterface){
  console.log(myObj.name)
}

let myobj = {
  size:10,
  name:'nihao'
}
consoleName(myobj)
// 正常编译
interface MyInterface{
  name: string
}


let myobj:MyInterface = {
  name:'nihao',
  size:10  //Error
}
// size出错
阅读 2k
2 个回答

简单来说,

{
  name:'nihao',
  size:10  //Error
}

不是一个 MyInterface 类型,但是它能够赋值给一个 MyInterface 类型的变量,因为前者能够兼容后者。

具体可以看类型兼容性

function consoleName(myObj: MyInterface){
  console.log(myObj.name)
}

上面的类型检查包含2部分:

  1. 是入参的校验,只要你的入参中的属性,包含我声明类型的属性就好了。同时这也是合理的
  2. 函数体内使用的时候校验; 在函数体内必须进行严格校验; 也就是说,只能使用 MyInterface中声明的类型

结合上面的2点;你就可以知道了,有了第二条,那么第一条就能顺利通过;因为多余的属性我根本不会用到;检查就没有任何意义了。

// 定义变量的时候,声明类型;这属于强制的
let myobj:MyInterface = {
  name:'nihao',
  size:10  //Error
}

这个时候 myobj 必须严格按照 interface 中规范好的属性进行配置

ps:如何想偷懒,接口可以如下定义

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