内容简介:作者:Dr. Axel Rauschmayer
每日前端夜话 第290篇
翻译: 疯狂的技术宅
作者:Dr. Axel Rauschmayer
来源:2ality.com
正文共:1537 字
预计阅读时间:7 分钟
TypeScript中的类型是什么?本文中描述了两种有助于理解它们的观点。
每个角度三个问题
以下三个问题对于理解类型如何工作非常重要,并且需要从两个角度分别回答。
-
myVariable
具有MyType
类型是什么意思?
1 let myVariable: MyType = /*...*/;
-
SourceType
是否可以分配给TargetType
?
1 let source: SourceType = /*...*/; 2 let target: TargetType = source;
-
TypeUnion
是如何从Type1
,Type2
和Type3
派生的?
1 type TypeUnion = Type1 | Type2 | Type3;
观点1:类型是值的集合
从这个角度来看,类型是一组值:
-
如果
myVariable
的类型为MyType
,则意味着所有可以分配给myVariable
的值都必须是MyType
集合的元素。 -
SourceType
可分配给TargetType
,SourceType
是TargetType
的子集。结果所有能被SourceType
接受的值也被TargetType
接受。 -
类型
Type1
、Type2
和Type3
的类型联合是定义它们集合的集合理论 union。
观点2:类型兼容性关系
从这个角度来看,我们不关心值本身以及在执行代码时它们是如何流动的。相反,我们采取了更加静态的观点:
-
源代码中包含 location,每个 location 都有一个静态类型。在支持 TypeScript 的编辑器中,如果将光标悬停在 location 上方,则可以看到该 location 的静态类型。
-
当源 location 通过分配、函数调用等连接到目标 location 时,则源 location 的类型必须与目标 location 的类型兼容。TypeScript 规范通过所谓的 类型关系 (https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3.11)定义类型兼容性。
-
类型关系 分配兼容性 (https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3114-assignment-compatibility)定义什么时候把源类型
S
分配给目标类型T
: -
S
和T
是相同的类型。 -
S
或T
是any
类型。 -
等
让我们考虑以下问题:
-
如果将
myVariable
的静态类型分配给MyType
,则myVariable
的类型为MyType
。 -
如果
SourceType
是兼容分配的,则可以将它们分配给TargetType
。 -
通过类型关系 apparent 成员 (https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3111-apparent-members)定义类型 union 的工作方式。
TypeScript 类型系统的一个有趣特征是,同一变量在不同位置可以具有不同的静态类型:
1const arr = []; 2// %inferred-type: any[] 3arr; 4 5arr.push(123); 6// %inferred-type: number[] 7arr; 8 9arr.push('abc'); 10// %inferred-type: (string | number)[] 11arr;
名义类型系统与结构类型系统
静态类型系统的职责之一是确定两种静态类型是否兼容:
-
实际参数的静态类型
U
(例如,通过函数调用提供) -
对应形式参数的静态类型
T
(在函数定义中指定)
这通常意味着检查 U
是否为 T
的子类型。大致有两种检查方法:
-
在 名义 类型系统中,两个静态类型如果具有相同的标识(“名称”)则相等。如果明确声明了它们的子类型关系,则一种类型是另一种类型的子类型。
-
名义类型的语言为 C ++、 Java 、C#、Swift 和 Rust。
-
在 结构 类型系统中,两个静态类型具有相同的结构(如果它们具有相同的名称和相同的类型)则相等。如果
U
具有T
的所有部分(可能还有其他),并且U
的每个部分具有T
的相应部分的子类型,则类型U
是另一种类型T
的子类型。 -
具有结构化类型的语言为 OCaml/ReasonML、Haskell 和 TypeScript。
以下代码在名义类型系统中会产生类型错误(A 行),但在 TypeScript 的结构类型系统中是合法的,因为类 A
和类 B
具有相同的结构:
1class A { 2 name = 'A'; 3} 4class B { 5 name = 'B'; 6} 7const someVariable: A = new B(); // (A)
TypeScript 的 interface 在结构上也可以正常工作 —— 不必为了匹配而实现它们:
1interface Point { 2 x: number; 3 y: number; 4} 5const point: Point = {x: 1, y: 2}; // OK
进一步阅读
-
TypeScript 手册中的“类型兼容性”一章:https://www.typescriptlang.org/docs/handbook/type-compatibility.html
-
TypeScript 规范中的 “TypeRelationships” 部分:https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#311-type-relationships
原文链接
https://2ality.com/2020/02/understanding-types-typescript.html
2020年京程一灯全新课程体系即将推出,请保持关注。
愿你在新的一年里保持技术领先,有个好前程,愿你月薪30K。我们是认真的 !
✎ 往期精彩回顾
从 JavaScript、ES6、ES7 到 ES10,你学到哪儿了?
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 从人类行为的角度理解状态管理
- 从运维的角度理解 memcached
- 从运维的角度理解memcached
- 从源码角度深入理解Glide(下)
- 从工程的角度,重新理解 Python
- 以“一个公式” 的角度理解原型链
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
PHP Cookbook
Adam Trachtenberg、David Sklar / O'Reilly Media / 2006-08-01 / USD 44.99
When it comes to creating dynamic web sites, the open source PHP language is red-hot property: used on more than 20 million web sites today, PHP is now more popular than Microsoft's ASP.NET technology......一起来看看 《PHP Cookbook》 这本书的介绍吧!
UNIX 时间戳转换
UNIX 时间戳转换
HEX HSV 转换工具
HEX HSV 互换工具