typescript - Null değere sahip bir özellik neden "örtük any" olarak kabul ediliyor?


Şu şekilde basit bir nesneye sahip olabilirim:

const wut = {
  foo: 'foo',
  bar: 123,
  baz: { a: 'b' },
  lol: null
};

Ve TypeScript tüm bunlarla iyi, yalnızca lol özelliğinin null olarak atanması dışında:

error TS7018: Object literal's property 'lol' implicitly has an 'any' type.

         lol: null
           ~~~~~~~~~

Bu neden oluyor? Şunları yapmak zorunda kalıyorum:

  ...
  lol: null as null
};

Bu inanılmaz derecede aptalca görünüyor.

*** DÜZENLE ***

Bazılarının belirttiği gibi, sahip olduğum bazı kodlar şunu yaptığı için strictNullChecks'i kapatmıştım:

 public static listeners: { [ index in Event ]?: KeyMapping } = {};

...

 static register (event: Event, key: KeyCode, callback: () => void, bubble = true) {
     if (!service.listeners[event]) { service.listeners[event] = {}; }
     if (!service.listeners[event][key]) { service.listeners[event][key] = {}; }
     ...

Ve TypeScript saçmalık saçıyor:

error TS2532: Object is possibly 'undefined'.

52     if (!service.listeners[event][key]) { service.listeners[event][key] = {}; }
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bu tamamen hiçbir anlam ifade etmiyor! O nesnenin undefined olmasını önlemek için şunu yapıyor:

if (!service.listeners[event]) { service.listeners[event] = {}; }

Evet, bu dosyada, iç içe geçmiş nesne özelliklerine erişimle ilgili milyarlarca aptalca hata vardı obj[X][Y][Z], bu yüzden beni deli ettiği için o sıkı null kontrolünü kapattım.

Eğer biri bunun nasıl olur da tanımsız olabileceğini ve yukarıdaki gibi bir şeyi nasıl yeniden yazmam gerektiğini açıklayabilirse, tüm gözlerimle dinliyorum.

*** YİNE GÜNCELLEME *** https://www.typescriptlang.org/play?#code/MYewdgzgLgBAsgQQApIJIDkDiMC8MDeAUDDAMoASqAYgCoBcMAjAGwA0xZSCAwgKIMBmAEzsSCAEriA8gHUA+gBletQQHZRMCdPnjUmcvRgCAnBt6luyfjCGrCAXxgBDCDFCQoAbkKEoATwAHAFMYAGkgv24QABMQvH9gkAAzeGQ0LABtAGsI5JgEoLzEFAxMAF1vQgBLMCgggCckp2AQhSroILAGgg4Qetj6hjAAVwBbACMG7xJgJwAbOfHmrIYACgBKXAA+GAA3ECro6Zhx4fHxuaCGcZAQS6cwb3sfd2gw3gBNABFZdFwYADkOT80RAAHcwADvK9YKFPgBVJAkf5AiLDAJQ3yBEJwPy8XadWDxbF5OHfX4wAA++RJKTJiO8BRg8PhqC+cCcAQCNQA5v98DAMjAarEAB4MaD1XkwMoMNodLr1GDPJnhPwcrnS-mC4VgMW6sIRKKxGUAfgYLLZGu5YD59mh4Dec3adUVEAYAqFIqCooNuPxhLNDDV1uljjw+HtL0dsCc0Wi8td3TwqyCBNqDH96agrBgwODRpiQU2OB2RBIVRSqwAhM6FQ0IBk04SypsBXWk-VG83amV+fblRxKzAax3Og2m9mytkIq2CDAx27Jy2Z34+xGB89nkA