TypeScript任何与对象

我正在看TypeScript代码,并注意到他们使用

interface Blablabla { field: Object; } 

如何使用Object vs any有什么好处?

 interface Blablabla { field: any; } 

对象是比任何限制更多。 那是:

 interface MyInterface { b: Object; } var foo = (a : MyInterface) => alert(abnomethod()); 

不会编译,因为Object没有nomethod()函数。 如果你使用接口而不是Object它将会被编译。

所以总之, any可以是任何东西(你可以调用任何方法等没有编译错误)。 如果你明确地使用Object你将只能使用在Object类上定义的方法等。

有点旧,但不伤害添加一些笔记。

当你写这样的东西

 var a: any; var b: Object; var c: {}; 
  • a没有接口,它可以是任何东西,编译器对它的成员一无所知,所以在访问/分配给它自己及其成员时完成最小的types检查。 基本上,你告诉编译器“ 退后,我知道我在做什么,所以只要相信我 ”;
  • b具有Object接口,所以只有在该接口中定义的成员才可用于b 。 它仍然是JavaScript,所以一切都扩展了Object;
  • c扩展Object,就像TypeScript中的其他东西一样,但不添加任何成员。 由于TypeScript中的types兼容性是基于结构化子types的,而不是名义上的子types化,所以c最终与b相同,因为它们具有相同的接口:Object接口。

这就是为什么

 a.doSomething(); // Ok: the compiler trusts you on that b.doSomething(); // Error: Object has no doSomething member c.doSomething(); // Error: c neither has doSomething nor inherits it from Object 

为什么

 a.toString(); // Ok: whatever, dude, have it your way b.toString(); // Ok: toString is defined in Object c.toString(); // Ok: c inherits toString from Object 

因此,对于TypeScript, Object{}是等同的。 我没有看到有人真的使用它。 太严格了。

如果你声明这样的function

 function fa(param: any): void {} function fb(param: Object): void {} 

为了接受任何参数(也许你会在运行时检查types来决定如何处理它),请记住

  • 在编译器里面,你可以用param来做任何你想做的事情;
  • fb里面,编译器只会让你访问Object的成员,最终你不得不在那里做大量的types转换…

所以,基本上,当你不知道types的时候,去任何一个做运行时types检查。

显然,OOinheritance规则仍然适用,所以如果你想接受派生类的实例并根据它们的基类来对待它们,如

 interface IPerson { gender: string; } class Person implements IPerson { gender: string; } class Teacher extends Person {} function func(person: IPerson): void { console.log(person.gender); } func(new Person()); // Ok func(new Teacher()); // Ok func({gender: 'male'}); // Ok func({name: 'male'}); // Error: no gender.. 

基本types是做到这一点,而不是任何 。 但这是OO,在范围之外,我只是想澄清一下,只有当你不知道什么来的时候才应该使用,其他的你应该注解正确的types。

更新:

Typescript 2.2添加了一个objecttypes,它指定一个值是非原始的(即不是numberstringbooleansymbolundefinednull )。

考虑定义如下的函数:

 function b(x: Object) {} function c(x: {}) {} function d(x: object) {} 

x将在所有这些函数中具有相同的可用属性,但是对于非简单的任何东西来说,调用d是一个types错误:

 b("foo"); //Okay c("foo"); //Okay d("foo"); //Error: "foo" is a primitive 

any一种特定于TypeScript的东西都可以通过alex的回答得到很好的解释。

Object是指JavaScript objecttypes。 通常用作{}或有时候是new ObjectJavaScript中的大部分内容都与它inheritance的对象数据types兼容。 但是any都是特定于TypeScript的,并且与两个方向上的所有内容(不是基于inheritance)兼容。 例如:

 var foo:Object; var bar:any; var num:number; foo = num; // Not an error num = foo; // ERROR // Any is compatible both ways bar = num; num = bar; 

与所有types派生自“对象”的.NET相反,在TypeScript中,所有types派生自“任何”。 我只是想添加这个比较,因为我认为这将是一个普通的比较,因为更多的.NET开发人员尝试使用TypeScript。

对象似乎是比任何更具体的声明。 从TypeScript规范(第3节):

TypeScript中的所有types都是称为Anytypes的单个顶级types的子types。 any关键字引用此types。 Anytypes是可以表示任何没有约束的JavaScript值的types。 所有其他types被分类为基本types,对象types或types参数。 这些types在其值上引入了各种静态约束。

也:

Anytypes用于表示任何JavaScript值。 Anytypes的值支持与JavaScript中的值相同的操作,对任何值的操作都执行最小静态types检查。 具体而言,任何名称的属性都可以通过任何值访问,任何值都可以作为函数或具有任何参数列表的构造函数来调用。

对象不允许相同的灵活性。

例如:

 var myAny : any; myAny.Something(); // no problemo var myObject : Object; myObject.Something(); // Error: The property 'Something' does not exist on value of type 'Object'. 

joinAlex的答案并简化它:

对象的使用更为严格,因此给程序员更多的编译时间“评估”权力,因此在很多情况下提供了更多的“检查能力”,并防止任何泄漏,而任何一个都是更通用的术语和大量的编译时间检查可能因此被忽略。

尝试这个 :

 private a: Object<any> = {}; constructor() { a.name = "foo"; }