私は TypeScript コードを見ていて、それらが使用していることに気付きました:
interface Blablabla {
field: Object;
}
Object
次のようにvsany
を使用する利点は何ですか?
interface Blablabla {
field: any;
}
私は TypeScript コードを見ていて、それらが使用していることに気付きました:
interface Blablabla {
field: Object;
}
Object
次のようにvsany
を使用する利点は何ですか?
interface Blablabla {
field: any;
}
少し古いですが、メモを追加しても問題ありません。
このようなことを書くと
let a: any;
let b: Object;
let c: {};
そしてそれが理由です
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 に何でも受け入れるつもりで (実行時に型をチェックして、それをどうするかを決定するかもしれません)、それを覚えておいてください。
ただし、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
は、値が非プリミティブであることを指定する型を追加しました: (つまりnumber
、string
、boolean
、symbol
、undefined
、またはではありません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
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
何でもかまいません(コンパイルエラーなしで任意のメソッドなどを呼び出すことができます)Object
Object
クラスで定義された関数とプロパティを公開します。any
TypeScript に固有のものは、alex の回答によって非常によく説明されています。
Object
JavaScriptobject
タイプを参照します。{}
または時々として一般的に使用され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;
すべての型が「オブジェクト」から派生する .NET とは対照的に、TypeScript では、すべての型が「任意」から派生します。より多くの .NET 開発者が TypeScript を試してみると、一般的なものになると思うので、この比較を追加したかっただけです。
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'.