TypeScript koduna bakıyorum ve kullandıklarını fark ettim:
interface Blablabla {
field: Object;
}
ObjectVs kullanmanın faydası nedir any:
interface Blablabla {
field: any;
}
TypeScript koduna bakıyorum ve kullandıklarını fark ettim:
interface Blablabla {
field: Object;
}
ObjectVs kullanmanın faydası nedir any:
interface Blablabla {
field: any;
}
Yanıtlar:
Objectdaha kısıtlayıcıdır any. Örneğin:
let a: any;
let b: Object;
a.nomethod(); // Transpiles just fine
b.nomethod(); // Error: Property 'nomethod' does not exist on type 'Object'.
ObjectSınıf yoktur nomethod()dolayısıyla transpiler tam olduğunu bildiren bir hata oluşturur, işlevi. Eğer kullanırsanız anyyerine temelde bir şey, sen saklanan olduğu hakkında herhangi bir bilgi sağlıyoruz gider transpiler anlatıyorsun a- bu her şey olabilir! Ve bu nedenle, transpiler, istediğiniz gibi bir şey yapmanıza izin verecektir any.
Kısacası
any herhangi bir şey olabilir (derleme hataları olmadan üzerinde herhangi bir yöntemi vb çağırabilirsiniz)ObjectObjectsınıfta tanımlanan fonksiyonları ve özellikleri ortaya koyar .Biraz eski, ancak bazı notlar eklemeye zarar vermez.
Böyle bir şey yazdığınızda
let a: any;
let b: Object;
let c: {};
Ve bu yüzden
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
ve neden
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
Yani Objectve{} TypeScript içindeki eşdeğerleridir.
Bunun gibi işlevler bildirirseniz
function fa(param: any): void {}
function fb(param: Object): void {}
param için herhangi bir şey kabul etmek amacıyla (belki de onunla ne yapacağınıza karar vermek için çalışma zamanında türleri kontrol edersiniz), unutmayın
Bununla birlikte, eğer paramın bilinen birden çok türü kabul etmesi gerekiyorsa, daha iyi bir yaklaşımın, sendika türlerini kullanarak ilan etmek olduğu gibi,
function fc(param: string|number): void {}
Açıkçası, OO miras kuralları hala geçerlidir, bu nedenle türetilmiş sınıfların örneklerini kabul etmek ve onlara temel türlerine göre davranmak istiyorsanız,
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..
Baz türü değil, bunu yapmak için bir yoldur herhangi . Ama bu OO, kapsam dışı, sadece herhangi bir şeyin sadece neyin geldiğini bilmediğinizde kullanılması gerektiğini ve başka bir şey için doğru tipe açıklama eklemeniz gerektiğini açıklığa kavuşturmak istedim .
GÜNCELLEME:
2.2 typescript ilave objecttür bir değer, bir temel olmayan olduğunu belirtir: (örneğin bir number, string, boolean, symbol, undefined, ya da null).
Şu şekilde tanımlanan işlevleri göz önünde bulundurun:
function b(x: Object) {}
function c(x: {}) {}
function d(x: object) {}
xbu işlevlerin tümünde aynı özelliklere sahip olacaktır, ancak bu dbir ilkelle aramak için bir tür hatasıdır :
b("foo"); //Okay
c("foo"); //Okay
d("foo"); //Error: "foo" is a primitive
{}arabirimleri tanımlamanın (satır içi) normal yoludur, yalnızca bu durumda üye olmayan bir arabirim tanımlarsınız. Küçük fark, yanıtta iyi açıklanmıştır: " TypeScript'teki diğer her şey gibi {}uzanır Object".
anyve çalışma zamanı türü denetimi yapın. Kullanmayın any, bunun yerine karşı kontrol ediyoruz tiplerinin bir birlik kullanın: TypeA|InterfaceB|string. Bilinmeyen bir tür için varsayılan bir vakanız da varsa , birleşimden birine {}veya ekleyin Object.
But variables of type Object only allow you to assign any value to them - you can’t call arbitrary methods on them, even ones that actually exist:bana cevap bile okuduktan sonra toStringsöylemek istediklerini düşündüğümde aramaya bile izin verilmediğini düşündürdüler exist at runtime.
any TypeScript'e özgü bir şey, alex'in cevabı ile oldukça iyi açıklanmıştır.
ObjectJavaScript objecttürünü ifade eder . Yaygın olarak {}veya bazen kullanılır new Object. Javascript'teki çoğu şey, miras alırken nesne veri türüyle uyumludur. Ama anyolan typescript (kalıtım dayanmayan) özel ve her iki yönde de her şeyi ile uyumlu. Örneğin :
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;
Objectve objectTypeScript'te farklı türler.
Objectve objectTS?
Tüm türlerin bir "nesneden" türetildiği .NET'in aksine, TypeScript'te tüm türler "herhangi birinden" türetilir. Ben sadece daha fazla .NET geliştiricileri TypeScript denemek gibi yapılan yaygın bir olacağını düşünüyorum gibi bu karşılaştırma eklemek istedim.
Nesne, herhangi birinden daha spesifik bir bildirim olarak görünmektedir. TypeScript spesifikasyonundan (bölüm 3):
TypeScript'teki tüm türler, Herhangi bir tür adı verilen tek bir üst türün alt türleridir. Herhangi bir anahtar kelime bu tür referans. Herhangi bir tür, herhangi bir kısıtlama olmaksızın herhangi bir JavaScript değerini temsil edebilen türdür. Diğer tüm türler ilkel türler, nesne türleri veya tür parametreleri olarak kategorize edilir. Bu türler değerleri üzerinde çeşitli statik kısıtlamalar getirir.
Ayrıca:
Herhangi bir tür, herhangi bir JavaScript değerini temsil etmek için kullanılır. Herhangi bir türün değeri, JavaScript'teki bir değerle aynı işlemleri destekler ve Herhangi bir değerdeki işlemler için minimum statik tür denetimi gerçekleştirilir. Özellikle, herhangi bir adın özelliklerine Herhangi bir değer üzerinden erişilebilir ve Herhangi bir değere herhangi bir bağımsız değişken listesiyle işlev veya yapıcı olarak çağrılabilir.
Nesneler aynı esnekliğe izin vermez.
Örneğin:
var myAny : any;
myAny.Something(); // no problemo
var myObject : Object;
myObject.Something(); // Error: The property 'Something' does not exist on value of type 'Object'.
Alex'in cevabına ekleme ve basitleştirme:
Nesnelerin kullanımı daha katıdır ve bu nedenle programcıya daha derleme zamanı "değerlendirme" gücü verir ve bu nedenle birçok durumda daha fazla "kontrol yeteneği" sağlar ve herhangi bir sızıntıyı önleyebilir, buna karşılık daha genel bir terim ve çok fazla derleme bu nedenle zaman kontrolleri göz ardı edilebilir.
{}Object