Ostatnio wyszedł Typescript 3.7, który zawiera kilka oczekiwanych przez programistów funkcjonalności. Dziś chciałbym opowiedzieć o dwóch nowościach na które sam czekałem i które mogą uprościć tworzony przez nas kod czyli Optional Chaining i Nullish Coalescing.

Optional chaining

Na sam początek funkcjonalność, którą możemy znaleźć np.: w języku Swift i pozwala na bardziej zwięzłe pisanie kodu. Kiedy piszemy kod i opakowujemy dane w obiekty mamy możliwość korzystania z opcjonalnych pól np.:

interface Obj {
    a: string,
    b?: {
        a: string,
        b?: {
            a: string
        }
    }
}

const obj:Obj = {
    a: 'a',
    b: {
        a: 'a',
        b: {
            a:'a'
        }
    }
}

Problem pojawia się gdy chcemy się dostać do tych wartości. Aby to zrobić musimy sprawdzić czy nasze pola faktycznie mają odpowiednią wartość

 obj.b.a //Object is possibly 'undefined'.

if (obj.b) {
    obj.b.a
}

if (obj.b && obj.b.b) {
    obj.b.b
}

Dzięki nowej funkcjonalności jesteśmy w stanie skrócić powyższy zapis do czytelniejszej formy

obj.b?.a
obj.b?.b?.a

Jeśli pola obj.a i obj.b.b są różne od null lub undefined to dostaniemy wartość zmiennej, która znajduje się w tym obiekcie. Jeśli w którymkolwiek momencie okaże się, że zmienne nie posiadają wartości to dostaniemy w wyniku wartość undefined

 
const obj:Obj = {
    a: 'a',
    b: {
        a: 'a',
    }
}

obj.b?.b?.a // undefined

Oprócz możliwości dostania się do pola w obiekcie możemy również wykorzystać to do odwołania się do elementu w tablicy

 interface Tab {
    a?: number[]
}

const obj2: Tab = {
    a: [0,1]
}

obj2.a[0] // Object is possibly 'undefined'.
obj2.a?.[0]

Ostatnia możliwość to wywołanie funkcji

interface Fun {
    a?: ()=>void
}

const obj3: Fun = {
    a: () => { }
}

obj3.a() // Object is possibly 'undefined'.
obj3.a?.()

Nullish Coalescing

Druga nowość to Nullish Coalescing o którym myślę jako domyślnej wartości. Do tej pory mogliśmy ustawiać domyślną wartość na dwa sposoby

    value ? value : default
    value || default

Oba sposoby mogą jednak powodować niechciane efekty uboczne np.:

const example = 0;
const defaultValue = 1;

console.log(example ? example : defaultValue);
console.log(example || defaultValue) 

Nawet jeśli dopuszczamy wartość 0 jako poprawną to taki zapis powoduje, że zostanie ona zastąpiona wartością domyślną. Oczywiście da się temu zapobiec dodając dodatkowe warunki ale wydłuża to niepotrzebnie kod. Nowy Nullish Coalescing zwróci wartość domyślną tylko jeśli zmienna ma wartość null lub undefined. W każdym innym przypadku będzie to oryginalna wartość zmiennej

console.log(null ?? 1); // 1
console.log(undefined ?? 1); //1
console.log(0 ?? 1); //0
console.log(NaN ?? 1); //NaN
console.log('' ?? 1); // ''

A jak wam się podobają nowe funkcjonalności? Zaktualizowaliście już Typescript’a w waszych projektach? Będziecie używać tych funkcjonalności czy może już z nich korzystacie? No i najważniejsze - za chwilę te nowości będą też dostępne w czystym JavaScript.