TypeScript ਟੀਮ ਨੇ 6.0 ਰਿਲੀਜ਼ ਵਿੱਚ ਇੱਕ ਨਵਾਂ ਕੰਪਾਈਲਰ ਫਲੈਗ (compiler flag) ਸ਼ਿਪ ਕੀਤਾ ਹੈ – --noPropertyAccessFromIndexSignature। ਜਦੋਂ ਇਸਨੂੰ ਚਾਲੂ (enable) ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਕੰਪਾਈਲਰ ਉਹਨਾਂ ਪ੍ਰਾਪਰਟੀਜ਼ ਲਈ ਡੌਟ-ਨੋਟੇਸ਼ਨ (dot-notation) ਦੀ ਵਰਤੋਂ ਕਰਨ ਤੋਂ ਮਨ੍ਹਾ ਕਰ ਦਿੰਦਾ ਹੈ ਜੋ ਇੱਕ ਇੰਡੈਕਸ ਸਿਗਨੇਚਰ (index signature) ਤੋਂ ਆਉਂਦੀਆਂ ਹਨ, ਜਿਸ ਨਾਲ ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਬ੍ਰੈਕਟ ਨੋਟੇਸ਼ਨ (bracket notation) ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਮਜਬੂਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਪ੍ਰੋਡਕਸ਼ਨ ਵਿੱਚ ਜਾਣ ਦੀ ਬਜਾਏ ਕੰਪਾਈਲ ਟਾਈਮ (compile time) 'ਤੇ ਹੀ ਸੰਭਾਵੀ undefined ਮੁੱਲਾਂ ਨੂੰ ਸਾਹਮਣੇ ਲਿਆਂਦਾ ਜਾਂਦਾ ਹੈ।

ਇਹ ਫਲੈਗ ਕਿਉਂ ਮਹੱਤਵਪੂਰਨ ਹੈ

JavaScript ਵਿੱਚ, ਆਬਜੈਕਟ ਅਕਸਰ ਡਿਕਸ਼ਨਰੀਆਂ ਵਜੋਂ ਕੰਮ ਕਰਦੇ ਹਨ, ਅਤੇ TypeScript ਤੁਹਾਨੂੰ ਇੰਡੈਕਸ ਸਿਗਨੇਚਰ, ਜਿਵੇਂ ਕਿ Record<string, T> ਨਾਲ ਅਜਿਹੇ ਢਾਂਚੇ ਨੂੰ ਟਾਈਪ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ। ਭਾਸ਼ਾ obj.key ਅਤੇ obj["key"] ਨੂੰ ਆਪਸ ਵਿੱਚ ਬਦਲਣਯੋਗ ਮੰਨਦੀ ਹੈ, ਇਸ ਲਈ ਕੰਪਾਈਲਰ ਇਹ ਮੰਨ ਲੈਂਦਾ ਹੈ ਕਿ ਪ੍ਰਾਪਰਟੀ ਮੌਜੂਦ ਹੈ, ਭਾਵੇਂ ਕਿ ਕੀ (key) ਸਿਰਫ਼ ਰਨਟਾਈਮ (runtime) 'ਤੇ ਹੀ ਪਤਾ ਲੱਗਣਾ ਹੋਵੇ। ਉਹ ਚੁੱਪ ਰਹਿਣ ਵਾਲਾ ਅੰਦਾਜ਼ਾ ਕਈ ਕ੍ਰੈਸ਼ਾਂ ਦਾ ਕਾਰਨ ਬਣਦਾ ਹੈ: ਉਹ ਕੋਡ ਜੋ obj.missingProp ਨੂੰ ਐਕਸੈਸ ਕਰਦਾ ਹੈ, ਉਹ ਕੰਪਾਈਲ ਤਾਂ ਠੀਕ ਹੋ ਜਾਂਦਾ ਹੈ, ਚੱਲਦਾ ਵੀ ਹੈ, ਪਰ ਫਿਰ ਏਰਰ ਦਿੰਦਾ ਹੈ ਕਿਉਂਕਿ ਮੁੱਲ undefined ਹੁੰਦਾ ਹੈ।

ਡੌਟ ਨੋਟੇਸ਼ਨ ਇੱਕ ਅੰਦਰੂਨੀ ਗਾਰੰਟੀ ਲੈ ਕੇ ਆਉਂਦੀ ਹੈ – ਇਹ ਪੜ੍ਹਨ ਵਾਲਿਆਂ ਅਤੇ ਟਾਈਪ ਚੈਕਰ ਨੂੰ ਦੱਸਦੀ ਹੈ ਕਿ ਪ੍ਰਾਪਰਟੀ ਨਿਸ਼ਚਿਤ ਤੌਰ 'ਤੇ ਮੌਜੂਦ ਹੈ। ਇਸਦੇ ਉਲਟ, ਬ੍ਰੈਕਟ ਨੋਟੇਸ਼ਨ ਅਨਿਸ਼ਚਿਤਤਾ ਦਾ ਸੰਕੇਤ ਦਿੰਦੀ ਹੈ – ਕੀ (key) ਗੁੰਮ ਹੋ ਸਕਦੀ ਹੈ, ਅਤੇ ਨਤੀਜਾ undefined ਹੋ ਸਕਦਾ ਹੈ। --noPropertyAccessFromIndexSignature ਇਸ ਵਿਜ਼ੂਅਲ ਅਤੇ ਸਿਮੈਂਟਿਕ (semantic) ਅੰਤਰ ਨੂੰ ਲਾਗੂ ਕਰਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਰਨਟਾਈਮ ਐਰਰਾਂ ਦੀ ਇੱਕ ਸ਼੍ਰੇਣੀ ਨੂੰ ਕੰਪਾਈਲ-ਟਾਈਮ ਡਾਇਗਨੌਸਟਿਕਸ ਵਿੱਚ ਬਦਲ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ।

ਇਹ ਫਲੈਗ ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ

ਜਦੋਂ ਫਲੈਗ ਚਾਲੂ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਕੋਈ ਵੀ ਐਕਸਪ੍ਰੈਸ਼ਨ ਜੋ ਡੌਟ ਨੋਟੇਸ਼ਨ ਰਾਹੀਂ ਇੰਡੈਕਸ ਸਿਗਨੇਚਰ ਨਾਲ ਕਿਸੇ ਪ੍ਰਾਪਰਟੀ ਨੂੰ ਐਕਸੈਸ ਕਰਦਾ ਹੈ, ਉਸਨੂੰ ਐਰਰ ਵਜੋਂ ਫਲੈਗ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਕੋਡ ਨੂੰ ਬ੍ਰੈਕਟਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਦੁਬਾਰਾ ਲਿਖਣਾ ਪਵੇਗਾ:

// Before
const name = userData.name;          // OK even if "name" is not in the index

// After enabling the flag
const name = userData["name"];       // Error unless brackets are used

ਫਿਰ ਕੰਪਾਈਲਰ ਉਹੀ undefined-ਹੈਂਡਲਿੰਗ ਨਿਯਮ ਲਾਗੂ ਕਰਦਾ ਹੈ ਜੋ ਉਹ ਪਹਿਲਾਂ ਹੀ ਬ੍ਰੈਕਟ ਐਕਸੈਸ ਲਈ ਵਰਤਦਾ ਹੈ। ਜੇਕਰ --noUncheckedIndexedAccess ਵੀ ਚਾਲੂ ਹੈ, ਤਾਂ userData["name"] ਦਾ ਟਾਈਪ T | undefined ਬਣ ਜਾਂਦਾ ਹੈ, ਜੋ ਡਿਵੈਲਪਰ ਨੂੰ ਗੁੰਮ ਹੋਣ ਵਾਲੇ ਕੇਸ ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ ਮਜਬੂਰ ਕਰਦਾ ਹੈ।

ਪ੍ਰੈਕਟੀਕਲ ਮਾਈਗ੍ਰੇਸ਼ਨ ਕਦਮ

  1. tsconfig.json ਵਿੱਚ ਫਲੈਗ ਚਾਲੂ ਕਰੋ:

    {
      "compilerOptions": {
        "noPropertyAccessFromIndexSignature": true
      }
    }
    
  2. ਟਾਈਪ ਚੈਕਰ ਚਲਾਓ। ਇੰਡੈਕਸ-ਸਿਗਨੇਚਰ ਕੀਜ਼ ਤੱਕ ਸਾਰੇ ਡੌਟ-ਨੋਟੇਸ਼ਨ ਐਕਸੈਸ ਐਰਰ ਵਜੋਂ ਦਿਖਾਈ ਦੇਣਗੇ।

  3. ਡੌਟਸ ਨੂੰ ਬ੍ਰੈਕਟਾਂ ਨਾਲ ਬਦਲੋ। ਇਹ ਬਦਲਾਅ ਮਕੈਨੀਕਲ ਹੈ; ਇਹ ਰਨਟਾਈਮ ਪਰਫਾਰਮੈਂਸ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਕਰਦਾ।

  4. ਨਤੀਜੇ ਵਜੋਂ ਮਿਲਣ ਵਾਲੇ undefined ਟਾਈਪਸ ਨੂੰ ਹੱਲ ਕਰੋ। ਜਿੱਥੇ ਲੋੜ ਹੋਵੇ ਉੱਥੇ nullish coalescing, optional chaining, ਜਾਂ ਸਪੱਸ਼ਟ ਚੈੱਕ (explicit checks) ਜੋੜੋ।

  5. ਸਭ ਤੋਂ ਮਜ਼ਬੂਤ ਸੁਰੱਖਿਆ ਲਈ --noUncheckedIndexedAccess ਨਾਲ ਜੋੜਨ 'ਤੇ ਵਿਚਾਰ ਕਰੋ। ਇਕੱਠੇ ਮਿਲ ਕੇ ਉਹ ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦੇ ਹਨ ਕਿ ਡਿਕਸ਼ਨਰੀ-ਸ਼ੈਲੀ ਦੇ ਕਿਸੇ ਵੀ ਐਕਸੈਸ ਨੂੰ ਸੰਭਾਵੀ ਤੌਰ 'ਤੇ ਗੁੰਮ ਹੋਣ ਵਾਲਾ ਮੰਨਿਆ ਜਾਵੇ।

ਐਕਸਪਲਿਸਿਟ ਪ੍ਰਾਪਰਟੀਜ਼ ਨੂੰ ਕਦੋਂ ਰੱਖਣਾ ਹੈ

ਜੇਕਰ ਕੋਈ ਫੀਲਡ ਇੱਕ ਸਥਿਰ API ਕੰਟਰੈਕਟ ਦਾ ਹਿੱਸਾ ਹੈ, ਤਾਂ ਇੰਡੈਕਸ ਸਿਗਨੇਚਰ 'ਤੇ ਭਰੋਸਾ ਕਰਨ ਦੀ ਬਜਾਏ ਇਸਨੂੰ ਇੱਕ ਐਕਸਪਲਿਸਿਟ ਪ੍ਰਾਪਰਟੀ ਵਜੋਂ ਘੋਸ਼ਿਤ ਕਰੋ। ਐਕਸਪਲਿਸਿਟ ਪ੍ਰਾਪਰਟੀਜ਼ ਡੌਟ ਨੋਟੇਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣਾ ਜਾਰੀ ਰੱਖਦੀਆਂ ਹਨ, ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦੇ ਹੋਏ ਕਿ ਫੀਲਡ ਹਮੇਸ਼ਾ ਮੌਜੂਦ ਰਹੇਗੀ (ਜਿੱਥੋਂ ਤੱਕ ਟਾਈਪ ਸਿਸਟਮ ਦੀ ਪੁਸ਼ਟੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ)। ਇੰਡੈਕਸ ਸਿਗਨੇਚਰਾਂ ਨੂੰ ਸਿਰਫ਼ ਅਸਲ ਵਿੱਚ ਡਾਇਨਾਮਿਕ ਡੇਟਾ ਲਈ ਰੱਖੋ ਜਿੱਥੇ ਕੀਜ਼ ਪਹਿਲਾਂ ਤੋਂ ਨਹੀਂ ਪਤਾ ਹੁੰਦੀਆਂ।

ਵਿਰੋਧੀ ਬਿੰਦੂ: ਵਧੇਰੇ ਵਰਬੋਸਿਟੀ

ਕੁਝ ਟੀਮਾਂ ਨੂੰ ਵਾਧੂ ਬ੍ਰੈਕਟਾਂ ਸ਼ੋਰ ਵਾਲੇ ਲੱਗ ਸਕਦੇ ਹਨ, ਖਾਸ ਕਰਕੇ ਉਹਨਾਂ ਕੋਡਬੇਸਾਂ ਵਿੱਚ ਜੋ ਲਚਕਦਾਰ ਆਬਜੈਕਟਾਂ ਦੀ ਬਹੁਤ ਜ਼ਿਆਦਾ ਵਰਤੋਂ ਕਰਦੇ ਹਨ। ਇਹ ਫਲੈਗ ਇੱਕ ਸਖ਼ਤ ਅਨੁਸ਼ਾਸਨ ਲਾਗੂ ਕਰਦਾ ਹੈ ਜਿਸ ਲਈ ਲੇਗਸੀ ਪ੍ਰੋਜੈਕਟਾਂ ਲਈ ਵੱਡੇ ਪੱਧਰ 'ਤੇ ਰੀਫੈਕਟਰਿੰਗ ਦੀ ਲੋੜ ਹੋ ਸਕਦੀ ਹੈ। ਉਹਨਾਂ ਮਾਮਲਿਆਂ ਲਈ, ਫਲੈਗ ਨੂੰ ਹੌਲੀ-ਹੌਲੀ ਲਾਗੂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ, ਸ਼ਾਇਦ ਨਵੇਂ ਮੋਡੀਊਲਾਂ ਤੱਕ ਸੀਮਤ ਰੱਖ ਕੇ, ਜਦੋਂ ਕਿ ਵਿਆਪਕ ਕੋਡਬੇਸ ਸਮੇਂ ਦੇ ਨਾਲ ਇਸ ਪੈਟਰਨ ਨੂੰ ਅਪਣਾ ਲਵੇ।

ਅੱਗੇ ਕੀ ਦੇਖਣਾ ਹੈ

ਇਹ ਫਲੈਗ TypeScript 6.0 ਵਿੱਚ ਸਖ਼ਤ ਟਾਈਪ ਸੁਰੱਖਿਆ ਵੱਲ ਇੱਕ ਵਿਆਪਕ ਕੋਸ਼ਿਸ਼ ਦਾ ਹਿੱਸਾ ਹੈ। ਭਵਿੱਖ ਦੀਆਂ ਰਿਲੀਜ਼ਾਂ ਆਬਜੈਕਟ ਸਪ੍ਰੈਡ, ਆਪਸ਼ਨਲ ਚੇਨਿੰਗ, ਜਾਂ ਇਨਫਰਡ any ਦੀ ਵਰਤੋਂ ਦੇ ਆਲੇ-ਦੁਆਲੇ ਵਾਧੂ ਚੈੱਕ ਪੇਸ਼ ਕਰ ਸਕਦੀਆਂ ਹਨ। TypeScript ਰੋਡਮੈਪ 'ਤੇ ਨਜ਼ਰ ਰੱਖਣ ਨਾਲ ਟੀਮਾਂ ਨੂੰ ਇਹ ਫੈਸਲਾ ਲੈਣ ਵਿੱਚ ਮਦਦ ਮਿਲੇਗੀ ਕਿ ਡਿਲੀਵਰੀ ਸ਼ਡਿਊਲ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕੀਤੇ ਬਿਨਾਂ ਅਗਲੇ ਸੁਰੱਖਿਆ ਫੀਚਰਾਂ ਨੂੰ ਕਦੋਂ ਅਪਣਾਉਣਾ ਹੈ।

ਸਿੱਖਿਆ (Takeaway): --noPropertyAccessFromIndexSignature ਨੂੰ ਚਾਲ