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

时间:2017-04-12 14:59:14

标签: javascript angular typescript any

我有一个类对象:

groupNameData: GroupNameData = new GroupNameData();

我有一个any对象

 groupNameDatas: any;

作业1(class = any)

我刚刚将类对象值分配给any对象,比如

this.groupNameDatas = this.groupNameData;

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

作业2(任何=类)

现在我已经改变了作业,比如

this.groupNameData = this.groupNameDatas;// any to class

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

4 个答案:

答案 0 :(得分: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;
  

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

any类型带来的乐趣。打字稿无法知道您的any类型变量是否包含您的对象的实例。它是任何东西,所以它可能是你对象的一个​​实例。

答案 1 :(得分:4)

如果你看一下official documentation,就会清楚地说"任何"所有编译时间检查都被忽略。

文档中的相关摘录:

  

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

public class BBBThread implements Runnable {

    int i=0;
    public void add() {
        synchronized(this){     
            i++;
            System.out.println(i);
        }
    }

    @ooverride
    public void run() {
        for (int i=0; i < 10000; i++) {
            add();
        }
    }

    public static void main(String[] args) {
        BBBThread bbbObj =new BBBThread();
        Thread t1=new Thread(bbbObj,"A");
        Thread t2=new Thread(bbbObj, "B");
        Thread t3=new Thread(bbbObj, "C");
        Thread t4=new Thread(bbbObj, "D");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
     

任何类型都是使用现有JavaScript的强大方式,   允许您逐步选择加入并选择退出类型检查   汇编。你可能希望Object扮演类似的角色   用其他语言做。但是Object类型的变量只允许你   为它们分配任何值 - 你不能调用任意方法   他们,甚至是那些确实存在的人:

     

您是否应该选择使用其他类型,例如数字或字符串   编译时间检查启动,你知道它不对。

let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
     

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

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'.

答案 2 :(得分:1)

TypeScript需要与传统的静态类型语言不同的思维方式。在C#或Java之类的语言中,除非编程人员提供了足够的信息以使编译器清楚,否则编译器将给出类型错误,否则程序不应给出类型错误。在Typescript中,仅当程序员已提供足够的信息让编译器知道类型无效时,编译器才会给出类型错误。

使用Any会使信息脱离编译器。

Typescript的创建是为了允许增量添加类型信息,并且在编译时发现的错误数量与类型信息允许的数量相同。可以将其视为利用所提供的任何类型信息的“超级皮棉”。

多年来,Typescript越来越接近那些习惯于严格编译时间类型检查语言的人(像我一样)所期望的东西,但是最重要的是,它仍然能够“很好地”适合Javascript。

答案 3 :(得分:1)

您可以阅读 unknown - 这是 any 类型的类型安全对应物。

这是一个 link with the differences