Przejdź do treści

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    TS18048

    Możliwe undefined

    'maybe.a' is possibly 'undefined'.

    Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.

    Opcjonalna właściwość została użyta bez sprawdzenia. Przy `strictNullChecks` „opcjonalna” znaczy, że nieobecność jest częścią typu i trzeba ją obsłużyć.

    Odtworzenie

    declare const maybe: { a?: { b: number } }
    
    maybe.a.b

    Build potwierdza, że to emituje dokładnie ten kod.

    Dlaczego kompilator tak mówi

    Bez `strictNullChecks` to się kompiluje i wybucha w czasie wykonania; z nim luka staje się widoczna tam, gdzie da się ją jeszcze naprawić. Błąd nie prosi o dowód, że wartość istnieje — prosi, byś powiedział, co ma się stać, gdy jej nie ma, a na to pytanie kod po cichu odpowiadał „awaria”.

    Naprawy

    1. 01
      declare const maybe: { a?: { b: number } }
      
      const value = maybe.a?.b

      Opcjonalne łączenie odpowiada „nic się nie dzieje, wynikiem jest `undefined`” — co jest słuszne, gdy wołający sobie z tym radzi.

    2. 02
      declare const maybe: { a?: { b: number } }
      
      if (maybe.a) {
        const value = maybe.a.b
      }

      Strażnik odpowiada „w takim razie nie robimy nic” i zawęża typ dla całego bloku, a nie jednego dostępu.

    Wniosek

    Asercja niepustości `!` też to ucisza i jest jedyną naprawą, która odpowiada na pytanie obietnicą zamiast kodem. Zostaw ją na przypadki, które naprawdę potrafisz udowodnić.

    Dokąd dalej

    Błędy