typescript - 这两个 typeScript 代码有什么区别?

标签 typescript typescript1.7

这两个 typeScript 代码有什么区别?(我使用 typeScript 1.7.5)

interface SquareConfig {
  color?: string;
  width?: number;
}

function createSquare(config: SquareConfig): {color: string; area: number} {
  var newSquare = {color: "white", area: 100};
  if (config.color) {
    newSquare.color = config.color;
  }
  if (config.width) {
    newSquare.area = config.width * config.width;
  }
  return newSquare;
}

var obj = {color1: "black"};
var mySquare = createSquare(obj);

什么时候编译不是错误而是代码生成错误。

interface SquareConfig {
  color?: string;
  width?: number;
}

function createSquare(config: SquareConfig): {color: string; area: number} {
  var newSquare = {color: "white", area: 100};
  if (config.color) {
    newSquare.color = config.color;
  }
  if (config.width) {
    newSquare.area = config.width * config.width;
  }
  return newSquare;
}

var mySquare = createSquare({color1: "black"});

错误:

test.ts(18,30): error TS2345: Argument of type '{ color1: string; }' is not assignable to parameter of type 'SquareConfig'. Object literal may only specify known properties, and 'color1' does not exist in type 'SquareConfig'.

最佳答案

您的两个示例都有相同的(感知​​到的)错误,即您指定了 SquareConfig 未知的属性,这通常意味着您输入了错误的属性名称。

在您的情况下,您已经指定了 color1,您可能打算在其中使用 color

在添加检查未指定属性的附加功能之前,此代码会使用旧版本的 TypeScript 进行编译。

修复...

选项一,指定正确的属性:

var mySquare = createSquare({color: "black"});

选项二,您故意打算包含一些其他属性,使用类型断言告诉编译器您比它更了解(只要您确定您实际上比它更了解!):

var mySquare = createSquare(<SquareConfig>{color1: "black"});

根据评论更新

你拥有的“分离度”越少,编译器就越严格......例如:

// Error
var obj: SquareConfig = {color1: "black"};

// OK
var obj = {color1: "black"};
var obj2: SquareConfig = obj;

让我们看第一个例子,我们说“我打算创建一个SquareConfig”。编译器说,“好吧,没有必需的项目,因为一切都是可选的,但你正在创建一个我不认识的属性的对象 - 所以我会警告你”。

第二个例子略有不同。我们说“我打算使用我拥有的对象作为 SquareConfig”。编译器说,“您打算使用的对象是否缺少任何必需的属性......并且每个属性是否具有正确的类型以成为 SquareConfig 的结构匹配 - 是的。”

如果第二种情况警告您目标结构上不存在的属性,您将无法利用结构类型系统提供的 super 多态性。

关于typescript - 这两个 typeScript 代码有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34810248/

相关文章:

node.js - TypeScript 没有将 javascript 与 VS 2015 中的 Node.js TS 应用程序合并为单个文件

typescript 泛型 : infer type from the type of function arguments?

javascript - 一个函数即可订阅并返回值 - 提高函数纯度?

Angular 2 - 一个组件触发页面上另一个组件的刷新

reactjs - 如何在 Typescript(输入组件)中使用 React Hook Form

typescript - Typescript 1.8 是否需要引用路径声明?

typescript - 在 TS 1.7 中重新导出 ES6 模块?

typescript - 为此模块添加类型定义的正确方法是什么

typescript - Typescript 数组文字语法的差异

javascript - 当我尝试将 vis.js 与 Svelte 结合使用时,出现意外标记 'export'