为什么Typescript允许为类对象分配"任何"对象类型?

Ram*_*ran 6 javascript any typescript angular

我有一个类对象:

groupNameData: GroupNameData = new GroupNameData();
Run Code Online (Sandbox Code Playgroud)

我有一个any对象

 groupNameDatas: any;
Run Code Online (Sandbox Code Playgroud)

作业1(class = any)

我只是将类对象值赋给了any对象,比如

this.groupNameDatas = this.groupNameData;
Run Code Online (Sandbox Code Playgroud)

这意味着,this.groupNameDatas(Any)可以接受任何类型的数据,因为它是一个any对象.

作业2(任何=类)

现在我已经改变了作业,就像

this.groupNameData = this.groupNameDatas;// any to class
Run Code Online (Sandbox Code Playgroud)

它也像我的第一个任务示例一样工作.为什么它没有抛出错误cannot convert implicitly "any" to "GroupNameData"

Leo*_*aia 6

这是预期的行为(docs).希望这个样本能够澄清它:

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;
Run Code Online (Sandbox Code Playgroud)

但是,打字稿如何接受将任何对象分配给类对象?

这是any类型的乐趣.Typescript无法知道您的any-typed变量是否包含您的对象的实例.它是任何东西,所以它可能是你的对象的一个​​实例.


小智 6

如果您查看官方文档,它清楚地说明“任何”所有编译时检查都将被忽略。

文档中的相关片段:

我们在编写应用程序时可能需要描述我们不知道的变量类型。这些值可能来自动态内容,例如来自用户或第 3 方库。在这些情况下,我们希望选择退出类型检查并让值通过编译时检查。为此,我们将这些标记为 any 类型:

let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
Run Code Online (Sandbox Code Playgroud)

any 类型是使用现有 JavaScript 的一种强大方式,允许您在编译期间逐渐选择加入和选择退出类型检查。您可能希望 Object 扮演类似的角色,就像在其他语言中一样。但是 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'.
Run Code Online (Sandbox Code Playgroud)

如果您知道类型的某些部分,但可能不是全部,则 any 类型也很方便。例如,您可能有一个数组,但该数组混合了不同类型:

let list: any[] = [1, true, "free"];

list[1] = 100;
Run Code Online (Sandbox Code Playgroud)