问题描述
我有一个类对象:
groupNameData: GroupNameData = new GroupNameData();
,我有一个任意对象
groupNameDatas: any;
分配 1(类别=任意)
我刚刚将类对象值分配给任何对象,例如
this.groupNameDatas = this.groupNameData;
这意味着, this.groupNameDatas(any) 可以接受任何类型的数据,因为它是一个 any 对象。
分配 2(任意=类别)
现在我已经颠倒了分配,如
this.groupNameData = this.groupNameDatas;// any to class
它也像我的第一个作业示例一样工作。 为什么它不抛出像cannotconvertimplicitly“any”to“GroupNameData”这样的错误?
推荐答案
这是预期的行为(文档)。 希望这个示例能够澄清这一点:
let someObj = new MyClass(); // someObj will be of the "MyClass" type. let anyObject : any; // since anyObject is typed as any, it can hold any type: anyObject = 1; anyObject = "foo"; // including your class: anyObject = someObj; // so, if it can hold anything, it's expected that we can assign our custom classes to it: someObj = anyObj;
但是如何通过接受击键将任何对象分配给类对象呢?
这就是任意打字的乐趣。 类型签名无法知道您的任意类型变量是否包含对象的实例。 这就是它的本质typescript 对象值copy,所以它可能是您的对象的一个实例。
其他推荐答案
如果您查看官方文档,它清楚地表明“任何”所有编译时检查都会被忽略。
文档中的相关代码:
我们在编写应用程序时可能需要描述一个我们不知道的变量的类型。 该值可以来自动态内容,例如来自用户或第三方库。 在这种情况下,我们要选择使用类型检测typescript 对象值copy,让值通过编译时检测。 因此,我们用任何类型来标记它:
let notSure: any = 4; notSure = "maybe a string instead"; notSure = false; // okay, definitely a boolean
Any type 是使用现有 JavaScript 的强大方式,允许您在汇编过程中逐步选择和选择类型检测。 您可能希望该对象扮演与其他语言中类似的角色。 但是 object 类型的变量只允许你为它们分配任何值 - 即使它们实际上存在,你也无法调用它们的任何方法:
如果您选择使用其他类型的 type.Number 或 String 编译时检测会播放并且您知道它是不正确的。
let notSure: any = 4; notSure.ifItExists(); // okay, ifItExists might exist at runtime notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check) let prettySure: Object = 4; prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.
如果您知道类型的各个部分(显然不是全部),那么任何类型也会很方便。 例如,您可能有一个链表,但有一个混合不同类型的数组:
let list: any[] = [1, true, "free"]; list[1] = 100;
其他推荐答案
打字需要不同的思维方式,与传统静态类型语言的思维方式不同。 在 C# 或 Java 等语言中,Complatic 会给出类型错误,除非程序员提供足够的信息来向编译器澄清,否则它不应该给出类型错误。 在鼠标中,如果程序员提供了足够的信息来了解类型无效,则编译器只会给出类型错误。
使用 Any 可以使信息远离编译器。
低格式允许在编译时以任何错误的增量添加类型信息。 它可以被认为是提供任何类型信息的“超级 lint”。
多年来,类型签名已经越来越接近人们(比如我)对使用严格编译时类型检查的语言的期望,但它仍然“与 JavaScript 配合得很好”。