TypeScriptのコードを見ていて、彼らが使っていることに気づきました。
interface Blablabla {
field: Object;
}
のように、Object
とany
を使い分けることのメリットは何でしょうか?
interface Blablabla {
field: any;
}
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を使用した場合、基本的にはトランスパイラに「何でもあり」と伝えていることになります。そのため、トランスパイラは
any` として定義されたものに対して何でもできるようになります。
要するに
は、
Object` クラスで定義された関数やプロパティを公開します。any`はTypeScript特有のものであることは、alex'さんの回答でよくわかりました。
Object
は JavaScript の object
型を指します。一般的には {}
や時には new Object
として使われます。JavaScriptのほとんどのものは、オブジェクトデータ型を継承しているので、オブジェクトデータ型と互換性があります。しかし、any
はTypeScript*固有のもので、双方向ですべてのものと互換性があります(継承ベースではありません)。
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;
Objectはanyよりも具体的な宣言のようです。TypeScriptの仕様書(セクション3)より。
TypeScriptのすべての型は、以下のように呼ばれる単一のトップ型のサブタイプです。 と呼ばれるトップタイプのサブタイプです。anyキーワードはこの型を参照します。Any型は Any型は、JavaScriptのどのような値でも制約なく表現できる唯一の型です。 他のすべての型は、プリミティブ型、オブジェクト型、型パラメータに分類されます。 型パラメータに分類されます。これらの型は、その値に様々な静的制約を導入します。 これらの型は、その値に様々な静的制約をもたらします。
また
Any型は、任意のJavaScriptの値を表すために使用されます。Any型の値は
Any型は、JavaScriptの値と同じ操作をサポートしており 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'.