Hosszú történet rövid, nincs megoldás, hogy itt tetszik mindenkinek.
Tekintsük ezt a közös idióma:
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
}
Ez lenne elég béna, hogy feladja, és úgy dönt, hogy a „cím” a „minden”, mert nincs a legjobb gyakori típusa az Ügyfél és a cím.
A legtöbb esetben, ha az && operátor használata esetén akár a típus már egyezik, vagy && használják egy értéket coalescing módon, mint a fenti. Mindkét esetben visszatérő típus a jobb oldali operandus ad a felhasználónak a várt típusú.
Míg a típusú biztonsági technikailag összeomlanak ezen a ponton, hogy nem csinál olyan módon, hogy ez valószínűleg egy hiba. Vagy fogsz tesztelni a kapott érték truthiness (ebben az esetben a típus több vagy kevesebb nem számít), vagy fogsz használni a feltételezett jobb oldali operandus valamilyen műveletet (a fenti példában csinál mindkettő).
Ha megnézzük a példát Ön által felsorolt és úgy tesznek, mintha a bal oldali operandusa indeterminately truthy vagy falsy majd próbálja írni épelméjű kódot, ami működik a visszatérési érték, ez lesz sokkal pontosabban - ott csak nem sok mindent lehet csinálni a „hamis && {}”, hogy még nem megy be egy»minden«argumentum pozíció vagy truthiness teszt.
Függelék
Mivel néhány ember nem győzte meg a fenti, itt egy másik magyarázat.
Tegyük egy pillanatra, hogy a géppel típusú rendszer három új típusok: Truthy<T>, Falsy<T>és Maybe<T>, ami a lehető truthy / falsy típusú értékek T. A szabályok az ilyen típusú a következők:
Truthy<T> pontosan úgy viselkedik, mint a T
- Nem lehet hozzáférni tulajdonságai
Falsy<T>
- Egy expressziós típusú
Maybe<T>, ha használják, mint az az állapot, egy ifblokkban, válik Truthy<T>a szervezetben ugyanezen ifblokk és egy Falsy<T>a elseblokk
Ez engedi meg a dolgokat, mint ez:
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!
}
Elég jó eddig. Most már tudjuk kitalálni, milyen típusú szabályok vannak az && operátor.
Truthy<T> && x legyen hiba - ha a bal oldali tudvalevően truthy, akkor éppen megírt x
Falsy<T> && xlegyen hiba - ha a bal oldali tudvalevően falsy, xelérhetetlen kód
Maybe<T> && x kell készítenie ... mi?
Tudjuk, hogy az eredmény Maybe<T> && xlesz vagy egy falsy típusú érték T, vagy x. Ez nem tud előállítani Truthy<T>(hacsak T== típusát x, amely esetben ezt az egész vitát vitás). Nevezzük ezt az új típusú Falsy<T> XOR Maybe<U>.
Mit kell a szabályokat Falsy<T> XOR Maybe<U>lenni?
- Nyilvánvaló, hogy nem tudja használni tulajdonságait
Trajta. Ha az érték típusú T, ez falsy, és nem biztonságos használatra.
- Meg kell tudni használni, mint egy
Maybe<U>, mivel Falsy<T>és Falsy<U>van egyforma viselkedés
- Nem kell tudni használni tulajdonságait
U, mert az érték még mindig lehet falsy.
- Ha ez egy
ifteszt, akkor kell, hogy legyen Truthy<U>a blokk, hogy a ifnyilatkozat
Más szóval, Falsy<T> XOR Maybe<U> az Maybe<U> . Ebből következik, mind ugyanazokat a szabályokat. Nem kell, hogy bonyolítja a típusú rendszer minden ide hozzáadásával ez a furcsa XORtípusú, mert olyan típus, amely illeszkedik az összes specifikációt, amire szükség van már létezik.
Ez egy kicsit olyan, mint valaki ad egy dobozt, és azt mondja: „Ez vagy egy üres doboz szemetet, vagy egy teljes doboz újrahasznosítható”. Nyugodtan üres a doboz tartalmát az újrahasznosítás bin.