typescript 的接口与继承兼容的问题

对于接口这部分和断言这部分提到的兼容有些疑惑。

  interface Animal {
    name: string;
  }
  let animal: Animal = {
    name: 'Tom',
    run: () => { console.log('run') }
  };
// 不能将类型“{ name: string; run: () => void; }”分配给类型“Animal”。
// 对象文字可以只指定已知属性,并且“run”不在类型“Animal”中。

上面的这段是会报错的,下面的就不会,想问下区别在哪里呢?

  interface Animal {
    name: string;
  }
  let tom = {
    name: 'Tom',
    run: () => { console.log('run') }
  };
  let animal: Animal = tom
阅读 4.9k
2 个回答

唔,所谓的“对象文字”在中文中其实一般翻译成“字面量”。

题目中的错误是 TS 的 “多余属性检查” 特性,是 TS 3.5 后新引入的。

目的是为了防止某些因拼写错误导致的问题,比如下面这种:

type Style = {
    alignment: string,
    color?: string
};

const s: Style = {
    alignment: 'center',
    colour: 'black' // ERROR!
};

这个特性仅在字面量声明对象中存在;下面的例子不是字面量,所以只检查是否符合鸭子类型就通过了。

tom 在类型上可以视作 Animal 的子类型,所以他可以被赋值给 Animal 类型的变量

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