Javascript 为什么Typescript允许分配一个;任何;对象类型到类对象?
我有一个类对象:Javascript 为什么Typescript允许分配一个;任何;对象类型到类对象?,javascript,angular,typescript,any,Javascript,Angular,Typescript,Any,我有一个类对象: groupNameData: GroupNameData = new GroupNameData(); 我有一个any对象 groupNameDatas: any; 作业1(类别=任何) 我刚刚将类对象值分配给任何对象,如 this.groupNameDatas = this.groupNameData; 这意味着,this.groupNameDatas(Any)可以接受任何类型的数据,因为它是Any对象 作业2(任意=班级) 现在我颠倒了任务,就像 this.grou
groupNameData: GroupNameData = new GroupNameData();
我有一个any
对象
groupNameDatas: any;
作业1(类别=任何)
我刚刚将类对象值分配给任何对象,如
this.groupNameDatas = this.groupNameData;
这意味着,this.groupNameDatas
(Any)可以接受任何类型的数据,因为它是Any
对象
作业2(任意=班级)
现在我颠倒了任务,就像
this.groupNameData = this.groupNameDatas;// any to class
它也像我的第一个作业示例一样工作。为什么它没有抛出类似无法隐式地将“any”转换为“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如何接受将任何对象分配给类对象呢
这就是any
类型的乐趣所在。Typescript无法知道任何类型的变量是否包含对象的实例。它是任何东西,因此它可能是对象的一个实例。如果您查看,它清楚地表明,对于“any”,所有编译时检查都被忽略
文档中的相关片段:
我们可能需要描述在编写应用程序时不知道的变量类型。这些值可能来自动态内容,例如来自用户或第三方库。在这些情况下,我们希望退出类型检查,让值通过编译时检查。要做到这一点,我们可以使用任何类型的标签:
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
any类型是使用现有JavaScript的强大方式,
允许您在检查期间逐步选择加入和退出类型检查
汇编您可能期望对象扮演类似的角色,因为它
用其他语言写。但是Object类型的变量只允许
要给它们赋值,不能对其调用任意方法
他们,甚至是那些真正存在的人:
您是否应选择使用其他类型,例如数字或字符串
编译时检查开始了,您知道这是不对的
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'.
如果您知道类型的某些部分,那么any类型也很方便,但是
也许不是全部。例如,您可能有一个数组,但
阵列混合了多种类型:
let list: any[] = [1, true, "free"];
list[1] = 100;
TypeScript需要一种不同于传统静态类型语言的思维方式。在C#或Java等语言中,编译器会给出一个类型错误,除非程序员提供了足够的信息,让编译器明白它不应该给出类型错误。在Typescript中,如果程序员提供了足够的信息让编译器知道类型无效,编译器只会给出一个类型错误
使用Any
会从编译器中带走信息
创建Typescript是为了允许增量添加类型信息,并在编译时发现程序中尽可能多的bug。可以将其视为“超级lint”,它利用了提供的任何类型信息
多年来,Typescript已经接近了习惯于严格编译时类型检查语言的人们(如我)的期望,但最棒的是它仍然“适合”Javascript,因为它的类型是any
,所以它可以是任何类型。我想你误解了我的问题。实际上我的问题是为什么类对象是接受任何对象?有意义吗?@LeonardoChaia,请再看一次我的问题。如果你理解类型的目的,这似乎有点明显。你想要一个香蕉。我给你这个魔法盒子里的东西,里面有一些随机的东西。让我们希望这是一个好消息banana@peeskillet如果您一直在使用C#这样的静态类型语言,我认为这一点并不明显,因为从object
为特定类型变量赋值总是需要强制转换。没有理由如此居高临下。Typescript无法知道任何类型的变量是否包含对象的实例,所以它完全覆盖了我的类对象??好吧,Javascript就是这样工作的。如果你可以在Javascript上做,你可以在Typescript上做。那么这和let
和var
一样吗?如果你可以在Javascript上做,你可以在Typescript上做这件事,这就是我问这个问题的原因。对不起,我仍然不理解比较。也许这是另一个如此重要的问题。