Neden && operatörü ikinci işlenen türünü üretmek yok

oy
24

Hakkında §4.15.6 içinde typescript şartname devletler &&operatörü:

&& operatörün herhangi bir tür için işlenen izin verir ve üreten bir ikinci işlenen aynı türde sonucu .

JavaScript olarak, &&bu falsy ise operatör, aksi takdirde, ikinci işlenen döndürür, ilk terim verir ( ECMA-262 §11.11 bakınız ).

Yani sol işlenen falsy ise, yani &&sol işlenen türüne uygun bir değer döndürecektir. Örneğin,

typeof ( false && {}      ) === boolean // true
typeof ( ''    && 1       ) === string  // true
typeof ( null  && hello ) === object  // true
typeof ( NaN   && true    ) === number  // true

Typescript, yukarıda alıntılanan kuralına göre, olurdu yanlış yukarıdaki ifadelerin türleri olmak tahmin Object, Number, Stringve Booleansırasıyla.

Ben bir şey eksik? Bir türü yapmak için iyi bir neden var mı &&, ifade, ikinci işlenen türüne uygun? Sonuç türü gibi davranmaz mı ||operatör ve iki işlenen en yaygın türü dönün ve Anyiyi ortak türünün yoksa?

Oluştur 02/10/2012 saat 16:50
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
20

Uzun lafın kısası, mutlu herkes burada hiçbir çözüm var.

Bu ortak bir dil düşünün:

var customer = GetCustomer(...); // of type 'Customer'
var address = customer && customer.address;
if(address) {
    printAddressLabel(address); // Signature: (Address) => void
} else {
    // Couldn't find the customer or the customer has no address on file
}

Vazgeçip 'adresi' olduğuna karar oldukça topal olurdu 'herhangi bir' Müşteri ve Adres arasında hiçbir iyi yaygın türü var, çünkü.

&& operatör türleri kullanıldığı zaman, vakaların çoğunda zaten eşleşen ya da yukarıdaki gibi bir değer birleştirici şekilde && kullanılmaktadır. Her iki durumda da, sağ işlenen türünü dönen kullanıcıya beklenen tipini verir.

tip emniyet teknik olarak bu noktada koptuğunu da, bir hataya yol muhtemel olan bir şekilde bu yüzden yapmıyor. Ya (tip az ya da çok ilgisiz bu durumda) doğruluğuna ilişkin çıkan değer test edeceğiz, yoksa bazı operasyon (hem yapıyor yukarıdaki örnek) için varsayımsal sağ işlenen kullanacağız.

Kadar olabilir sadece orada değil - biz listelenen örneklere bakıp dönüş değeri üzerinde faaliyet aklı başında kod yazmayı deneyin ardından sol işlenen belirsiz truthy veya falsy olduğunu iddia ve varsa, bu çok daha net hale gelir yapmak yanlış' ile && {} herhangi bir 'argümanı pozisyonunda veya truthiness testi' zaten bir içine girmeyeceği anlamına'.


ek

Bazı insanlar yukarıdaki ikna olmadıkları için, burada farklı bir açıklama.

: En typescript tip sistemi üç yeni tip eklenen bir an için farzedelim Truthy<T>, Falsy<T>ve Maybe<T>tip olası truthy / falsy değerleri temsil, T. Aşağıdaki gibi bu tür için kurallar şunlardır:

  1. Truthy<T> Tam gibi davranır T
  2. Sen herhangi özelliklerine erişemez Falsy<T>
  3. Tip bir ifade Maybe<T>, bir şart olarak kullanılan ifblok bir hale Truthy<T>aynı gövdesinde ifblok ve bir Falsy<T>de elseblok

Bu da, bu gibi şeyler yapalım istiyoruz:

function fn(x: Maybe<Customer>) {
   if(x) {
      console.log(x.address); // OK
   } else {
      console.log(x.phone); // Error: x is definitely falsy
   }
   console.log(x.name); // Warning: x might be falsy!
}

Oldukça iyi şimdiye kadar. Şimdi tip kuralları && operatörü için ne olduğunu anlayabiliriz.

  • Truthy<T> && x Bir hata olmalı - sol tarafı truthy olduğu biliniyorsa, sadece yazılı olması gerekirdi x
  • Falsy<T> && xbir hata olmalıdır - sol taraf falsy olduğu biliniyorsa, xerişilemiyor kodudur
  • Maybe<T> && x üretmelidir ... ne?

Biz sonucudur biliyoruz Maybe<T> && xbir falsy türünün değer ya olacak T, ya da x. Bu üretemez Truthy<T>(sürece Tait == tipi xbu durumda tüm bu tartışma tartışmaya açıktır). En bu yeni tip diyelim Falsy<T> XOR Maybe<U>.

Kuralları ne olmalıdır Falsy<T> XOR Maybe<U>olmak?

  • Belli ki özelliklerini kullanamazsınız Tüzerinde. Değer türdeyse T, bu falsy ve kullanımının güvenli değil.
  • Bir olarak kullanmak mümkün olmalıdır Maybe<U>çünkü, Falsy<T>ve Falsy<U>aynı davranışlara sahip
  • Sen özelliklerini kullanabilmek için olmamalı Udeğeri hala falsy olabilir çünkü.
  • İster şirket kullanırsanız iftesti, o zaman olması gerektiğini Truthy<U>bunun bloğunda ifaçıklamada

Başka bir deyişle, Falsy<T> XOR Maybe<U> bir Maybe<U> . Hepsi aynı kurallara uyar. Bu garip ekleyerek burada hiç tip sistemini zorlaştırmak gerekmez XORsize gerekli olan tüm özelliklere uyan bir türü zaten var, çünkü türü.

Bu biraz birisi bir kutu veren ve "Bu çöp boş kutu veya geri dönüştürülebilir tam kutu ya" diyerek gibidir. Güvenle geri dönüşüm kutusu içine kutunun içeriğini boşaltabilir.

Cevap 02/10/2012 saat 17:55
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more