'any'vs'Object'

Oli*_*alo 188 typescript

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

interface Blablabla {

   field: Object;

}
Run Code Online (Sandbox Code Playgroud)

使用Objectvs有什么好处any,如:

interface Blablabla {

  field: any;

}
Run Code Online (Sandbox Code Playgroud)

die*_*lar 252

有点旧,但添加一些笔记并没有伤害.

当你写这样的东西

var a: any;
var b: Object;
var c: {};
Run Code Online (Sandbox Code Playgroud)
  • a没有接口,它可以是任何东西,编译器对其成员一无所知,因此在访问/分配它自己及其成员时完成最小类型检查.基本上,你告诉编译器" 退后,我知道我在做什么,所以只要相信我 ";
  • b具有Object接口,因此只有该接口中定义的成员可用于b.它仍然是JavaScript,所以一切都扩展了Object;
  • c扩展Object,与TypeScript中的任何其他内容一样,但不添加任何成员.由于TypeScript中的类型兼容性基于结构子类型,而不是名义子类型,因此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
Run Code Online (Sandbox Code Playgroud)

为什么

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

因此,无论Object{}是等价的打字稿.我没有看到任何人真正使用它.限制太多了.

如果你声明这样的函数

function fa(param: any): void {}
function fb(param: Object): void {}
Run Code Online (Sandbox Code Playgroud)

为了接受param的任何东西(也许你将在运行时检查类型以决定如何处理它),请记住

  • fa里面,编译器会让你用param做你想做的事;
  • fb中,编译器只允许你访问Object的成员,你最终还是要在那里进行大量的类型转换......

所以,基本上,当你不知道类型时,请使用any并进行运行时类型检查.

显然,OO继承规则仍然适用,所以如果你想接受派生类的实例并根据它们的基类型对它们进行处理,就像在

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

基本类型是这样做的方式,而不是任何方式.但那是OO,超出范围,我只是想澄清一下,任何应该只在你不知道什么时候才会被使用,而对于任何其他你应该注释正确的类型.

更新:

打字稿2.2加入object类型,指定一个值是一个非原语:(即,不是一个number,string,boolean,symbol,undefined,或null).

考虑定义为的函数:

function b(x: Object) {}
function c(x: {}) {}
function d(x: object) {}
Run Code Online (Sandbox Code Playgroud)

x将在所有这些函数中具有相同的可用属性,但是d使用非原始函数调用它是一个类型错误:

b("foo"); //Okay
c("foo"); //Okay
d("foo"); //Error: "foo" is a primitive
Run Code Online (Sandbox Code Playgroud)

  • 我想向你投票给你_So,基本上,当你不知道类型时,请使用`any`并进行运行时类型检查._不要使用`any`,而是使用一个联合的您要检查的类型:`TypeA | InterfaceB | string`.如果您还有一个未知类型的默认情况,请向联合添加"{}"或"Object". (7认同)
  • `{}`是定义(内联)接口的常用方法,只是在这种情况下,您定义的是没有成员的接口.在响应中很好地解释了这个细微的差别:"`{}`扩展`Object`,就像TypeScript中的其他任何东西一样. (4认同)
  • 有没有人知道*为什么*他们决定添加`{}`然后他们已经有了`Object`?(反之亦然,以先到者为准)必须有一些细微的差别,对吧? (2认同)

Nyp*_*pan 185

Object比...更具限制性any.那是:

let a: any;
let b: Object;

a.nomethod(); // Transpiles just fine
b.nomethod(); // Error: Property 'nomethod' does not exist on type 'Object'.
Run Code Online (Sandbox Code Playgroud)

编译,因为Object不具备nomethod()的功能.如果你any在界面中使用而不是a它将编译.

所以简而言之,any可以是任何东西(你可以在没有编译错误的情况下调用任何方法等).如果明确使用any,则只能使用在Object类上定义的属性.


bas*_*rat 23

any 亚力克斯的回答很好地解释了TypeScript特有的东西.

Object指的是JavaScript object类型.常用{}或有时候使用new Object.javascript中的大多数内容与对象数据类型兼容,因为它们从中继承.但TypeScriptany是特定的,并且与两个方向上的所有内容兼容(不基于继承).例如:

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

  • 您的答案非常模糊,并且混合了 TypeScript 中不同类型的“Object”和“object”。 (4认同)
  • [此](https://blog.mariusschulz.com/2017/02/24/typescript-2-2-the-object-type#object-vs-object-vs) 可能是了解差异的最佳来源。重点是`object` 是所有非原始类型的类型,而`Object` 是一个接口,包含诸如`toString` 之类的常见内容。数字“42”将是“对象”,但不是“对象”。 (4认同)

yel*_*ode 17

与所有类型派生自"对象"的.NET相反,在TypeScript中,所有类型都派生自"any".我只是想添加这个比较,因为我认为这将是一个常见的比较,因为更多的.NET开发人员尝试使用TypeScript.


Ale*_*sko 14

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

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

也:

Any类型用于表示任何JavaScript值.Any类型的值支持与JavaScript中的值相同的操作,并且对Any值的操作执行最小的静态类型检查.具体来说,任何名称的属性都可以通过Any值访问,Any值可以作为带有任何参数列表的函数或构造函数调用.

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

例如:

var myAny : any;

myAny.Something(); // no problemo

var myObject : Object;

myObject.Something(); // Error: The property 'Something' does not exist on value of type 'Object'.
Run Code Online (Sandbox Code Playgroud)

  • 编辑.也许不是最好的修正案,但至少是真实的.:) (2认同)