首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么打字本允许进行子类型?

为什么打字本允许进行子类型?
EN

Stack Overflow用户
提问于 2019-03-15 10:17:30
回答 1查看 1.5K关注 0票数 1

根据docs的说法,“TypeScript中的类型兼容性是基于结构子类型”。所以这是有可能的:

代码语言:javascript
复制
type Person: {
  name: string;
}

const developer = {
  name: 'Joe',
  language: 'Typescript',
}

// this is ok because Person is a subtype of typeof developer
const otherDeveloper: Person = developer; // who writes code like that?!

这有许多后果,其中之一是在使用Object.keys时丢失类型信息:

代码语言:javascript
复制
// "keys" type is array of strings not `name` literal as this would be of course wrong because in runtime "keys" is ['name', 'language']
const keys = Object.keys(otherDeveloper); 

所以我试图找出TS文档中这种子类型的原因,就像他们保证的那样,但我找不到

我们仔细考虑了TypeScript允许不健全行为的地方,在整个文档中,我们将解释这些行为发生的地点以及它们背后的激励场景。

唯一可能对我有帮助的地方是一个期望对象类型更窄的函数,例如:

代码语言:javascript
复制
function getName(person: Person) {
  return person.name;
}

getName(developer); // works fine because of subtyping

我个人认为,如果你必须在这种情况下使用演员的话,我看不出什么大问题:

代码语言:javascript
复制
getName(developer as Person);

还有其他我可能遗漏的例子吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-15 11:40:45

类型记录使用结构类型的原因是JS是鸭子类型。

因此,您可以按照上面在JS中所写的进行操作,理想情况下,您可以在TS中以一种更安全的方式完成它。Javascript不关心已声明的对象类型,JS中没有这样的概念,它只关心对象在运行时具有的属性。因此,任何对象都可以传递到您的getName函数中,只要存在name属性,函数就可以正确地运行。

此外,由于JS具有不属于特定类的对象文本,因此很难在任何地方显式地指定继承关系。将类型关系显式化将使TS不太适合JS开发人员。在一个结构类型系统中,类型主要是我们的工作,您可以从它中获得很多好处,而不必非常明确。

有一些方法可以通过使用私有属性(ex)或使用品牌类型(ex)来绕过结构类型,并在类型记录中模仿规范类型。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55180304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档