'herhangi bir' ve 'Nesne'


210

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:


202

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 .

285

Biraz eski, ancak bazı notlar eklemeye zarar vermez.

Böyle bir şey yazdığınızda

let a: any;
let b: Object;
let c: {};
  • Bir / erişen o ve üyelerine hem atarken hiçbir tür denetlemesi gerçekleştirilir hiçbir arayüze sahip, herhangi bir şey olabilir, derleyici üyelerinin haberi yok. Temel olarak, derleyiciye " geri çekil, ne yaptığımı biliyorum, bu yüzden sadece bana güven " diyorsunuz ;
  • b , Object arabirimine sahiptir, bu nedenle SADECE bu arabirimde tanımlanan üyeler b için kullanılabilir durumdadır . Hala JavaScript, bu yüzden her şey Object'i genişletiyor;
  • c Nesneyi TypeScript'teki diğer her şey gibi genişletir, ancak üye eklemez. Daktilo tür uyumluluğu yapısal alt tiplerinin dayalı olduğundan, nominal değil alt-tiplemesi, c ile aynı olduğu kadar uçları b aynı arabirimi için: nesne arabirimi.

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

  • fa içinde , derleyici param ile ne istersen yapmana izin verecek ;
  • fb içinde , derleyici yalnızca Object üyelerine başvurmanıza izin verir .

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

2
Daha önce eklemiş olsaydı neden eklemeye karar verdiklerini bilen var mı ? (ya da tam tersi, hangisi önce gelirse) Küçük bir fark olmalı, değil mi? {}Object
CletusW

4
{}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".
DanielM

7
Sizi çizgi için oy vermek istiyorum Yani, temel olarak, türü bilmediğinizde, devam edin 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.
ILMTitan

Daktilo metinleri bazen kafa karıştırıcıdır, örneğin 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.
Olga

24

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;  

1
Cevabınız oldukça belirsiz ve karışık Objectve objectTypeScript'te farklı türler.
m93a

@ m93a: Eğer arasındaki fark ne genişletilebilir Objectve objectTS?
Alexander Abakumov

4
Bu muhtemelen farkı öğrenmek için en iyi kaynaktır. Ana nokta, objectilkel olmayan her şey için bir türken, Objectbenzer şeyler gibi ortak şeyleri içeren bir arayüzdür toString. Sayı bir 42olur Objectama bir değil object.
m93a

20

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.


16

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

0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.