我有一个类对象:
groupNameData: GroupNameData = new GroupNameData();
我有一个any
对象
groupNameDatas: any;
我刚刚将类对象值分配给any
对象,比如
this.groupNameDatas = this.groupNameData;
这意味着,this.groupNameDatas
(任意)可以接受任何类型的数据,因为它是any
个对象。
现在我已经改变了作业,比如
this.groupNameData = this.groupNameDatas;// any to class
它也像我的第一个任务示例一样工作。为什么它没有抛出像cannot convert implicitly "any" to "GroupNameData"
这样的错误?
答案 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
类型的类型安全对应物。