TypeScript基础入门 - 类型兼容性 - 介绍

转发

TypeScript基础入门 - 类型兼容性 - 介绍

介绍

TypeScript中的类型兼容性基于结构子类型。
结构类型是一种仅根据其成员关联类型的方式。它正好与名义(nominal)类型形成对比。请看如下代码:

interface Named {
    name: string;
}

class Person {
    name: string;
}

let p: Named;
// OK, because of structural typing
p = new Person();

在使用基于名义类型的语言,比如C#或Java中,这段代码会报错,因为Person类没有明确说明其实现了Named接口。

TypeScript的结构性子类型是根据JavaScript代码的典型写法来设计的。 因为JavaScript里广泛地使用匿名对象,例如函数表达式和对象字面量,所以使用结构类型系统来描述这些类型比使用名义类型系统更好。

关于可靠性的注意事项

TypeScript的类型系统允许某些在编译阶段无法确认其安全性的操作。当一个类型系统具此属性时,被当做是“不可靠”的。TypeScript允许这种不可靠行为的发生是经过仔细考虑的。通过这篇文章,我们会解释什么时候会发生这种情况和其有利的一面。

开始

TypeScript结构化类型系统的基本规则是,如果x要兼容y,那么y至少具有与x相同的属性。比如:

interface Named {
    name: string;
}

let x: Named;
// y的推断类型 is { name: string; location: string; }
let y = { name: 'Alice', location: 'Seattle' };
x = y;

这里要检查y是否能赋值给x,编译器检查x中的每个属性,看是否能在y中也找到对应属性。 在这个例子中, y必须包含名字是name的string类型成员。y满足条件,因此赋值正确。

检查函数参数时使用相同的规则:

function greet(n: Named) {
    alert('Hello, ' + n.name);
}
greet(y); // OK

注意,y有个额外的location属性,但这不会引发错误。 只有目标类型(这里是 Named)的成员会被一一检查是否兼容。

这个比较过程是递归进行的,检查每个成员及子成员。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,268评论 19 139
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,910评论 2 9
  • 6点半下班,到家后,洗澡洗衣服完成后,不能放弃锻炼,做一个小时的瑜伽,放松自己!背诵古诗词一天一首,培...
    松脂梦阅读 540评论 0 0
  • 七八十年代的歌,好听。现在的歌,难听。这是因为,那个时候的人写歌不怕没人听,可以静下心来写,唱歌的人能认真地唱,听...
    讲坛论剑阅读 129评论 0 0
  • 终于鼓起勇气我报名参加了弗兰克的21天写作训练营。看到群里的伙伴们发表了的文章都那么优秀,真是羡慕。很多的伙伴在我...
    Lisa_沧州_商管阅读 212评论 2 3