打字稿:为什么传递对象和分配给该对象的变量作为参数之间有区别?

EEAH

为什么将分配给对象文字的变量作为实参(let x = {color: 'red', width: 200})与传递对象文字的实参({color: 'red', width: 200}之间有区别

换句话说,参数的值是相同的({color: 'red', width: 200})。
那么,为什么编译器在传递对象时进行多余的检查,而在传递给该对象的变量通过时进行“常规形状”检查呢?

cbdeveloper

考虑一下函数类型签名:

type SOME_OBJECT = {
  propA: TYPE_A,
  propB: TYPE_B
}

function foo(obj: SOME_OBJECT) {
  // WILL DO SOMETHING WITH obj
}

打字稿游乐场

在上面的示例中,函数foo期望一个对象obj具有a propAtypeTYPE_A和a propBtype TYPE_B只要某些东西满足了这些要求,功能foo就可以完成它的事情。至少,这就是其合同所隐含的含义。那么多余的属性应该检查obj什么呢?

现在让我们分配一个对象文字。假设您有一个带有可选参数 的类型maybe

interface SOME_OBJECT_WITH_OPTIONAL {
    color: string,
    width: number,
    maybe?: boolean
}

const x1: SOME_OBJECT_WITH_OPTIONAL = {
    color: "red",
    width: 200,
    mayeb: true      // <--- TS ERROR HERE - EXCESS PROPERTY CHECKING IS REALLY IMPORTANT
}

看到您已经将该maybe属性拼写mayeb多亏了多余的属性检查,Typescript警告您您犯了该错误。如果不按原样处理,您能想象疼痛吗?在我们的示例中,没有属性会丢失,因为它maybe是可选的,因此允许其丢失。您将不会收到任何错误或警告。

在此处输入图片说明

仍然期望obj类型为a的函数SOME_OBJECT_WITH_OBJECT不介意。因为所有的所要求的特性colorwidth存在。

在此处输入图片说明

您可以在此处阅读有关此主题的更多信息:

Typescrip文档-多余的属性检查

中-TypeScript接口介绍-对象文字和函数类型

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将对象分配给属性或分配给属性之间有什么区别?

来自分类Dev

打字稿错误:“对象”类型的参数无法分配给“ {} []”类型的参数

来自分类Dev

在 Swift 中将枚举分配给变量时,{} 和 = 之间有什么区别?

来自分类Javascript

TypeScript:为什么同一对象在定义时无法分配给接口,但是在作为参数传递时可以分配

来自分类Java

Java,将null分配给对象和just声明有什么区别

来自分类Javascript

打字稿中的枚举和对象有什么区别

来自分类Dev

为什么事先将地图对象作为列表对象打印时无法将其分配给变量

来自分类Dev

无法将http Get返回的数据分配给具有相同结构的打字稿对象

来自分类Dev

为什么不能将“具有属性的接口和具有索引签名的接口的交集”类型分配给仅具有该属性的对象?

来自分类Dev

如果{{}}没有分配给变量的字段,为什么没有显示分配给该变量的字段?

来自分类Dev

一个对象与分配给它的tkinter对象有什么区别?

来自分类Dev

分配给在ES5中作为参数传递的对象

来自分类Dev

C ++无法将在方法中作为指针传递的对象分配给变量

来自分类Dev

将对象分配给未定义和删除之间的区别

来自分类Dev

将具有超出属性的对象分配给变量时,TypeScript为什么不显示错误?

来自分类Dev

在Java中将对象和原始数据作为参数传递有什么区别?

来自分类Java

Java泛型方法和作为参数的方法对象之间有什么区别?

来自分类Dev

为什么有时需要在将对象作为参数传递之前创建变量

来自分类Dev

为什么不能将字符串变量分配给 json::value 对象?

来自分类Dev

为什么要“替换”而不是将新对象分配给相同的变量?

来自分类Dev

为什么不能使用方括号符号+变量将属性分配给对象?

来自分类Dev

打字稿类型 Never[] 不可分配给对象数组

来自分类Dev

类型错误:无法分配给打字稿中对象“[object Array]”的只读属性“0”

来自分类Dev

打字稿-指定类型的对象无法分配给通用类型

来自分类Dev

将键值对数组分配给2个arr对象打字稿

来自分类Dev

打字稿中的“无法分配给永不类型的参数”错误是什么?

来自分类Dev

为什么不能将项目分配给对象的常量?

来自分类Dev

Ruby:为什么冻结分配给常量的可变对象?

来自分类Dev

为什么将对象分配给接口?

Related 相关文章

  1. 1

    将对象分配给属性或分配给属性之间有什么区别?

  2. 2

    打字稿错误:“对象”类型的参数无法分配给“ {} []”类型的参数

  3. 3

    在 Swift 中将枚举分配给变量时,{} 和 = 之间有什么区别?

  4. 4

    TypeScript:为什么同一对象在定义时无法分配给接口,但是在作为参数传递时可以分配

  5. 5

    Java,将null分配给对象和just声明有什么区别

  6. 6

    打字稿中的枚举和对象有什么区别

  7. 7

    为什么事先将地图对象作为列表对象打印时无法将其分配给变量

  8. 8

    无法将http Get返回的数据分配给具有相同结构的打字稿对象

  9. 9

    为什么不能将“具有属性的接口和具有索引签名的接口的交集”类型分配给仅具有该属性的对象?

  10. 10

    如果{{}}没有分配给变量的字段,为什么没有显示分配给该变量的字段?

  11. 11

    一个对象与分配给它的tkinter对象有什么区别?

  12. 12

    分配给在ES5中作为参数传递的对象

  13. 13

    C ++无法将在方法中作为指针传递的对象分配给变量

  14. 14

    将对象分配给未定义和删除之间的区别

  15. 15

    将具有超出属性的对象分配给变量时,TypeScript为什么不显示错误?

  16. 16

    在Java中将对象和原始数据作为参数传递有什么区别?

  17. 17

    Java泛型方法和作为参数的方法对象之间有什么区别?

  18. 18

    为什么有时需要在将对象作为参数传递之前创建变量

  19. 19

    为什么不能将字符串变量分配给 json::value 对象?

  20. 20

    为什么要“替换”而不是将新对象分配给相同的变量?

  21. 21

    为什么不能使用方括号符号+变量将属性分配给对象?

  22. 22

    打字稿类型 Never[] 不可分配给对象数组

  23. 23

    类型错误:无法分配给打字稿中对象“[object Array]”的只读属性“0”

  24. 24

    打字稿-指定类型的对象无法分配给通用类型

  25. 25

    将键值对数组分配给2个arr对象打字稿

  26. 26

    打字稿中的“无法分配给永不类型的参数”错误是什么?

  27. 27

    为什么不能将项目分配给对象的常量?

  28. 28

    Ruby:为什么冻结分配给常量的可变对象?

  29. 29

    为什么将对象分配给接口?

热门标签

归档