245

私は TypeScript コードを見ていて、それらが使用していることに気付きました:

interface Blablabla {

   field: Object;

}

Object次のようにvsanyを使用する利点は何ですか?

interface Blablabla {

  field: any;

}
4

6 に答える 6

335

少し古いですが、メモを追加しても問題ありません。

このようなことを書くと

let a: any;
let b: Object;
let c: {};
  • aにはインターフェイスがなく、何でもかまいません。コンパイラはそのメンバーについて何も知らないため、それとそのメンバーの両方にアクセス/割り当てするときに型チェックは実行されません。基本的に、あなたはコンパイラに「バックオフするように言っています。私は自分が何をしているのか知っているので、私を信頼してください」;
  • bには Object インターフェイスがあるため、そのインターフェイスで定義されたメンバーのみがbで使用できます。これはまだ JavaScript なので、すべてが Object を拡張します。
  • cは、TypeScript の他のものと同様に Object を拡張しますが、メンバーは追加しません。TypeScript の型の互換性は、名目上のサブタイピングではなく、構造的なサブタイピングに基づいているため、cは、同じインターフェース (Object インターフェース) を持っているため、最終的にbと同じになります。

そしてそれが理由です

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

ObjectとはTypeScript{}で同等です。

これらのような関数を宣言すると

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

param に何でも受け入れるつもりで (実行時に型をチェックして、それをどうするかを決定するかもしれません)、それを覚えておいてください。

  • fa内では、コンパイラーはparamでやりたいことを何でもできるようにします。
  • fb内では、コンパイラはObjectのメンバーのみを参照できるようにします。

ただし、paramが複数の既知の型を受け入れることになっている場合は、次のように共用体型を使用して宣言することをお勧めします。

function fc(param: string|number): void {}

明らかに、オブジェクト指向の継承規則は引き続き適用されるため、派生クラスのインスタンスを受け入れて、それらの基本型に基づいて処理する場合は、次のようになります。

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

基本型はそれを行う方法であり、 any ではありませ。しかし、それは OO です。範囲外です。any は何が来るかわからない場合にのみ使用し、それ以外の場合は正しい型に注釈を付ける必要があること明確にしたかっただけです。

アップデート:

Typescript 2.2objectは、値が非プリミティブであることを指定する型を追加しました: (つまりnumberstringbooleansymbolundefined、またはではありませんnull)。

次のように定義された関数を検討してください。

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

xこれらすべての関数内で同じ利用可能なプロパティを持ちますがd、プリミティブで呼び出すのは型エラーです:

b("foo"); //Okay
c("foo"); //Okay
d("foo"); //Error: "foo" is a primitive
于 2015-03-01T16:03:12.020 に答える
230

Objectよりも制限的ですany。例えば:

let a: any;
let b: Object;

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

クラスには関数Objectがないnomethod()ため、トランスパイラーは正確にそれを伝えるエラーを生成します。代わりに使用anyする場合、基本的にトランスパイラーに何でもよいと伝えており、格納されているものに関する情報を提供していませんa-何でもかまいません! したがって、トランスパイラーを使用すると、 として定義されたものを使用して、必要なことを何でも実行できますany

要するに

  • any何でもかまいません(コンパイルエラーなしで任意のメソッドなどを呼び出すことができます)
  • ObjectObjectクラスで定義された関数とプロパティを公開します。
于 2013-09-23T14:28:54.527 に答える
26

anyTypeScript に固有のものは、alex の回答によって非常によく説明されています。

ObjectJavaScriptobjectタイプを参照します。{}または時々として一般的に使用されnew Objectます。JavaScriptのほとんどのものは、オブジェクト データ型から継承するため、オブジェクト データ型と互換性があります。ただしanyTypeScript固有であり、双方向のすべてのものと互換性があります (継承ベースではありません)。例:

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;  
于 2013-09-23T23:18:38.817 に答える
22

すべての型が「オブジェクト」から派生する .NET とは対照的に、TypeScript では、すべての型が「任意」から派生します。より多くの .NET 開発者が TypeScript を試してみると、一般的なものになると思うので、この比較を追加したかっただけです。

于 2013-09-24T15:00:09.563 に答える
18

Object は、どの宣言よりも具体的な宣言のようです。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'.
于 2013-09-23T14:28:52.057 に答える