【问题标题】:Typescript type checking mechanismTypescript 类型检查机制
【发布时间】:2016-02-16 22:17:24
【问题描述】:

在打字稿中,以下编译。

class Person {
  name : string;
}

class Employee {
  name : string;
}

var person : Person = new Employee();

为什么会这样??这不是:

class Person {
  name : string;
  surname : string;
}

class Employee {
  name : string;
}

var person : Person = new Employee();

除了:

类型employee不可分配给类型Person,属性姓氏 Employee 类型中缺少

所以。在编译时使用属性名称比较类型??!

编辑:是的。这是来自 typescript 编译器的代码进行检查。

            for (var i = 0; i < targets.length; i++) {
                var related = isRelatedTo(sources[i], targets[i], reportErrors);
                if (!related) {
                    return 0;
                }
                result &= related;
            }
            return result;

【问题讨论】:

  • 我正要写一个答案,但那里有不准确之处,因为我很少使用 TypeScript,所以我将发布一个链接到Type Compatibility[...]Type compatibility in TypeScript is based on structural subtyping. Structural typing is a way of relating types based solely on their members. This is in contrast with nominal typing.[...]

标签: javascript typescript


【解决方案1】:

实际上,Typescript 根据对象的“形状”确定对象的类型 - 如果两个类具有相同的成员并且它们的类型和可访问性匹配,则称它们是兼容的并且可以互换使用。函数也是如此。正如t.niese 在他们的评论中提到的那样,您可以在the TypeScript handbook 中找到更多关于这背后的原因和含义的信息。它基本上源于 JavaScript 大量使用匿名函数和对象这一事实,因此拥有更严格的类型系统可能会使在 TypeScript 中使用现有的 JS 库成为一项尴尬的任务。

【讨论】:

  • 这就是俗称的“Duck Typing”。
  • 有点——基于我对这个主题的有限理解,完全“鸭子类型”语言根本不在乎对象的形状,只要它能够满足在运行时(例如 JavaScript)。因为如果你使用了错误形状的对象,TypeScript 会抛出编译错误,所以它不能完全归类为鸭子类型;我想这就是他们在手册中使用“结构类型”一词的原因。也就是说,如果您忽略错误消息,它基本上会变成鸭子类型:p
  • ducktyping 的另一个原因:最终您将获得纯 JavaScript,仅此而已。如果能像 JS 一样正常运行就好了。
  • 只是为了澄清 - 这不是限制,因为 Javascript 不支持它。我在打字稿编译器中“修复”了它,所以如果类型不同,它会引发编译器错误......这很简单。这是支持旧 javascript 库的限制。
猜你喜欢
  • 2021-11-14
  • 2012-09-29
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 2018-10-31
  • 2018-07-29
相关资源
最近更新 更多